在C ++中,如果我有一个字符串
string s = "123abc";
我希望将123
部分作为int,我做
istringstream ss(s);
s >> myint;
离开abc
部分(如果需要)。应该如何在Python中完成?
答案 0 :(得分:2)
您可以使用itertools.takewhile
和一些string methods:
>>> from itertools import takewhile
>>> s = '123abc'
>>> int(''.join(takewhile(str.isdigit, s)))
123
>>>
答案 1 :(得分:1)
我能想到的最好的东西:
使用匹配位置
import re
s = '123abc'
match = re.match('^[0-9]+', s)
i = int(s[:match.end(0)])
0宽度分割(doesn't work)
import re
s = '123abc'
i, rest = re.split('(?<=[0-9])(?=[^0-9])', s, maxsplit=1)
i = int(i)
简单
for j, c in enumerate(s):
if not c.isdigit():
break
i = int(s[:j])
答案 2 :(得分:1)
这样的事情怎么样?:
>>> import re
>>> test = re.compile("^-?([0-9]+)([a-zA-Z]+)")
>>> result = test.match("123abc")
>>> result.group(0)
'123abc'
>>> int(result.group(1))
123
>>> result.group(2)
'abc'
>>> import re
>>> a = '123abc'
>>> b = '-123abc'
>>> c = '123 abc'
>>> d = '-123 ABC'
>>> test = re.compile("(^-?[0-9]+)( +)?([a-zA-Z]+)")
>>> e = [a,b,c,d]
>>> [int(test.match(x).group(1)) for x in e]
[123, -123, 123, -123]
>>> [test.match(x).group(2) for x in e]
[None, None, ' ', ' ']
>>> [test.match(x).group(3) for x in e]
['abc', 'abc', 'abc', 'ABC']
此外:
>>> [test.match(x).group(0,1,2,3) for x in e]
[('123abc', '123', None, 'abc'), ('-123abc', '-123', None, 'abc'), ('123 abc', '123', ' ', 'abc'), ('-123 ABC', '-123', ' ', 'ABC')]
>>> [test.match(x).group(0,1,2,3) for x in e][0]
('123abc', '123', None, 'abc')
>>> int([test.match(x).group(0,1,2,3) for x in e][0][1])
123
>>> int([test.match(x).group(0,1,2,3) for x in e][2][1])
123
>>> int([test.match(x).group(0,1,2,3) for x in e][3][1])
-123
>>> [test.match(x).group(0,1,2,3) for x in e][3][2]
' '
>>> [test.match(x).group(0,1,2,3) for x in e][3][3]
'ABC'
答案 3 :(得分:0)
int("123abc".strip(string.letters))
与itertools.takewhile
答案类似,但定义了要删除的内容。这个片段会在&#39; 123 abc&#39;上失败。例如,建议。此外,它并不关心要删除的字母在哪里。我更喜欢takewhile
方法,因为它对输入更改更加健壮。