在Python中获取输入前缀为int

时间:2014-06-30 21:29:03

标签: python string parsing

在C ++中,如果我有一个字符串

string s = "123abc";

我希望将123部分作为int,我做

istringstream ss(s);
s >> myint;

离开abc部分(如果需要)。应该如何在Python中完成?

4 个答案:

答案 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)

STR

简单

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方法,因为它对输入更改更加健壮。