如何在Python中找到正则表达式的所有匹配项?
当我使用 re.search()
这个函数在一段文本中查找匹配项时,程序会在找到第一个匹配后就停止了。
我该如何让程序继续运行,直到找到所有的匹配项呢?有没有其他的函数可以做到这一点?
2 个回答
0
另一种方法(虽然距离原帖已经过去了13年,但还是有点符合提问者的初衷)是先编译模式,然后在编译好的模式上调用 search()
方法,并逐步处理这个模式。这种方式稍微有点啰嗦,但如果你不喜欢使用前瞻等复杂的东西,可以试试下面这个函数。
def find_all_matches(pattern, string):
pat = re.compile(pattern)
pos = 0
out = []
while (match := pat.search(string, pos)) is not None:
pos = match.start() + 1
out.append(match[1])
return out
find_all_matches(r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# ['cats', 'dogs']
这个方法也适用于重叠匹配的情况:
find_all_matches(r'(\w\w)', "hello") # ['he', 'el', 'll', 'lo']
864
使用 re.findall
或 re.finditer
来替代。
re.findall(pattern, string)
会返回一个包含所有匹配字符串的列表。
re.finditer(pattern, string)
则会返回一个迭代器,这个迭代器可以用来获取 MatchObject
对象。
示例:
re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']
[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']