从12 + 13之类的字符串中将2位或更多位数提取到列表中

时间:2016-01-07 15:17:59

标签: python python-2.7

我正在尝试从"12+13"等字符串中提取数字。

当我只从中提取数字到列表时,它变为[1,2,1,3]

实际上我希望列表将数字设为[12,13],12,13也应该是整数。

我已经尝试过最好的解决方案,以下是代码

但它仍有缺点。

我被迫在字符串末尾添加一个空格......因为它正常运行。

我的代码

def extract(string1):
    l=len(string1)
    pos=0
    num=[]
    continuity=0
    for i in range(l):

        if string[i].isdigit()==True:
            continuity+=1

        else:

            num=num+ [int(string[pos:continuity])]
            continuity+=1
            pos=continuity
    return num

string="1+134-15 "#added a spaces at the end of the string

num1=[]

num1=extract(string)

print num1

5 个答案:

答案 0 :(得分:1)

这将完全适合您的情况(以及所有运算符,而不仅仅是+):

>>> import re
>>> equation = "12+13"
>>> tmp = re.findall('\\b\\d+\\b', equation)
>>> [int(i) for i in tmp]
[12, 13]

但是如果你将字符串格式化为运算符之间的空格(我认为这是正确的方法,并且仍然支持所有运算符,并且有空格)那么你甚至可以不用使用这样的正则表达式:

>>> equation = "12 + 13"
>>> [int(s) for s in equation.split() if s.isdigit()]
[12, 13]

旁注:如果您的唯一操作符是+,则可以通过执行以下操作来避免正则表达式:

>>> equation = "12+13"
>>> [int(s) for s in equation.split("+") if s.isdigit()]
[12, 13]

答案 1 :(得分:1)

另一个答案很棒(截至目前),但我想向您提供详细解释。 您要做的是将字符串拆分为“+”符号。在python中,可以使用str.split("+")完成此操作。

当它转换为您的代码时,结果就是这样。

ourStr = "12+13"
ourStr = ourStr.split("+")

但是,你不想将它们转换为整数吗?在python中,我们可以使用列表推导与int()来实现此结果。

要将整个数组转换为整数,我们可以使用。这几乎遍历每个索引,并将字符串转换为整数。

str = [int(s) for s in ourStr]

将这些结合在一起,我们得到了

ourStr = "12+13"
ourStr = ourStr.split("+")
ourStr = [int(s) for s in ourStr]

但是我们可以说它们可能是数组中的其他未知符号。就像使用了 @Idos 一样,在将它放入数组之前检查以确保它是一个数字可能是一个好主意。

我们可以进一步优化代码:

ourStr = "12+13"
ourStr = ourStr.split("+")
ourStr = [int(s) for s in ourStr if s.isdigit()]

答案 2 :(得分:0)

您可以使用正则表达式,这变得非常简单:

>>> s = "12+13"
>>> import re
>>> re.findall(r'\d+',s)
['12', '13']

基本上,\d匹配任何数字,+表示1或更多。所以re.findall(r'\d+',s)正在寻找一行中一个或多个数字的字符串的任何部分,并返回它找到的每个实例!

为了将它们转换为整数,正如许多人所说,你可以在得到结果后使用列表理解:

result = ['12', '13']
int_list = [int(x) for x in result]

python regex documentation

答案 3 :(得分:0)

这可以通过列表理解或内置方法解决,不需要regex

s = '12+13+14+15+16'
l = [int(x) for x in s.split('+')]
l = map(int, s.split('+'))
l = list(map(int, s.split('+'))) #If Python3
[12, 13, 14, 15, 16]

如果您不确定是否有任何非数字字符串,那么只需将条件添加到列表理解中:

l = [int(x) for x in s.split('+') if x.isdigit()]
l = map(lambda s:int(s) if s.isdigit() else None, s.split('+')) 
l = list(map(lambda s:int(s) if s.isdigit() else None, s.split('+'))) #If python3

现在考虑一下你可能会有这样的情况:

s = '12 + 13 + 14+15+16'
l = [int(x.strip()) for x in s.split('+') if x.strip().isdigit()]#had to strip x for any whitespace
l = (map(lambda s:int(s.strip()) if s.strip().isdigit() else None, s.split('+'))
l = list(map(lambda s:int(s.strip()) if s.strip().isdigit() else None, s.split('+'))) #Python3
[12, 13, 14, 15, 16]

或者:

l = [int(x) for x in map(str.strip,s.split('+')) if x.isdigit()]
l = map(lambda y:int(y) if y.isdigit() else None, map(str.strip,s.split('+')))
l = list(map(lambda y:int(y) if y.isdigit() else None, map(str.strip,s.split('+')))) #Python3

答案 4 :(得分:0)

我创建了一个从字符串中提取数字的函数。

def extract(string1):
    string1=string1+" "
    #added a spaces at the end of the string so that last number is also    extracted
    l=len(string1)
    pos=0
    num=[]
    continuity=0
    for i in range(l):

        if string1[i].isdigit()==True:
            continuity+=1

        else:

            if pos!=continuity:
                ''' This condition prevents consecutive execution
                of else part'''

                num=num+ [int(string1[pos:continuity])]

            continuity+=1
            pos=continuity
    return num

string="ab73t9+-*/182"

num1=[]

num1=extract(string)

print num1