在python中我试图使用正则表达式从字符串中获取多个输入;但是,我遇到了麻烦。对于字符串:
inputs = 12 1 345 543 2
我尝试使用:
match = re.match(r'\s*inputs\s*=(\s*\d+)+',string)
但是,这只返回值'2'
。我正在尝试捕获所有值'12','1','345','543','2'
,但不知道如何执行此操作。
非常感谢任何帮助!
编辑:谢谢大家解释为什么这不起作用并提供其他建议。对不起,如果这是一个重复的问题。
答案 0 :(得分:2)
您可以尝试以下方式:
re.findall("\d+", your_string)
。
答案 1 :(得分:1)
你不能用一个正则表达式(除非你使用.NET),因为每个捕获组只会返回一个结果,即使它被重复(在Python的情况下是最后一个)。
由于也不可能使用可变长度的外观(在这种情况下你可以做(?<=inputs.*=.*)\d+
),你必须将它分成两个步骤:
match = re.match(r'\s*inputs\s*=\s*(\d+(?:\s*\d+)+)', string)
integers = re.split(r'\s+',match.group(1))
现在你捕获整个整数列表(以及它们之间的空格),然后在空格处分割该捕获。
第二步也可以使用findall
:
integers = re.findall(r'\d+',match.group(1))
结果完全相同。
答案 2 :(得分:1)
您可以嵌入正则表达式:
import re
s = 'inputs = 12 1 345 543 2'
print re.findall(r'(\d+)', re.match(r'inputs\s*=\s*([\s\d]+)', s).group(1))
>>>
['12', '1', '345', '543', '2']
或者分层进行:
import re
def get_inputs(s, regex=r'inputs\s*=\s*([\s\d]+)'):
match = re.match(regex, s)
if not match:
return False # or raise an exception - whatever you want
else:
return re.findall(r'(\d+)', match.group(1))
s = 'inputs = 12 1 345 543 2'
print get_inputs(s)
>>>
['12', '1', '345', '543', '2']
答案 3 :(得分:0)
你应该看看这个答案:https://stackoverflow.com/a/4651893/1129561
简而言之:
在Python中,使用单个正则表达式是不可能的:每个组的捕获都会覆盖同一组的最后一次捕获(在.NET中,这实际上是可行的,因为引擎区分了捕获和组)。