例如:
import re
FOO = """neighbors= {5 7 9 11 13 14 15 16 17 }"""
COMPILE = re.compile('(neighbors\s*=\s*\{\s*(\d+\s*)+\})')
match = re.findall(COMPILE, FOO)
print match[0]
(代码来自此处:find a repetitive expression using python regular expression)
这只会捕获最后一组,即“17”。如果我想捕获这些组中的每一个,即 “5”,“7”,“9”,......?
答案 0 :(得分:3)
基本上,您不能使用单个捕获组,后跟重复标记+
或*
来捕获任意数量的序列。
也许你应该捕获整数序列然后拆分它,如下所示:
import re
FOO = """neighbors= {5 7 9 11 13 14 15 16 17 }"""
COMPILE = re.compile('(neighbors\s*=\s*\{\s*((\d+\s*)+)\})') # added a capturing group
match = re.findall(COMPILE, FOO)
print match[0][1].split()
打印:
['5', '7', '9', '11', '13', '14', '15', '16', '17']
此外,您可能不需要findall
,只需要match
,就像这样:
import re
FOO = """neighbors= {5 7 9 11 13 14 15 16 17 }"""
COMPILE = re.compile('(neighbors\s*=\s*\{\s*((\d+\s*)+)\})')
match = re.match(COMPILE, FOO)
if match:
print match.group(2).split()
else:
print 'input does not match regex'
您还可以查看以下类似问题的最佳答案:
答案 1 :(得分:2)
我建议使用更简单的正则表达式来匹配所有数字,并将其与re.findall
一起使用:
import re
s = 'neighbors= {5 7 9 11 13 14 15 16 17 }'
r = re.compile('(\d+)')
print re.findall(r,s)
输出
Out[5]: ['5', '7', '9', '11', '13', '14', '15', '16', '17']