Python正则表达式匹配未知次数的模式
例如:
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]
(这段代码来自这里:使用Python正则表达式查找重复的表达式)
这段代码只会捕捉到最后一个组,也就是“17 ”。如果我想捕捉到每一个组,比如“5”、“7”、“9”等等,应该怎么做呢?
2 个回答
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'
你还可以看看以下类似问题的热门回答:
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']