如何在Python中找到正则表达式的所有匹配项?

516 投票
2 回答
531013 浏览
提问于 2025-04-16 10:00

当我使用 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.findallre.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']

撰写回答