python正则表达式捕获出现未知次数的模式

时间:2014-03-04 12:31:10

标签: python regex

例如:

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”,......?

2 个答案:

答案 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'

您还可以查看以下类似问题的最佳答案:

python regex for repeating string

Python RegEx multiple groups

答案 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']