Python正则表达式匹配未知次数的模式

1 投票
2 回答
536 浏览
提问于 2025-04-17 20:46

例如:

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'

你还可以看看以下类似问题的热门回答:

python 正则表达式用于重复字符串

Python 正则表达式多个组

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

撰写回答