我正在尝试从"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
答案 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]
答案 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