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


312

在我编写的程序中,我使用Python re.search()函数在文本块中查找匹配项并打印结果。但是,一旦找到文本块中的第一个匹配项,程序就会退出。

在找到所有匹配项之前程序不停止的情况下,如何重复执行此操作?是否有单独的功能来执行此操作?


递归RE是另一种野兽。您要重复搜索。
2011年

Answers:


545

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

18
finditer是我一直在寻找的东西。我很惊讶一个返回Match对象,另一个返回字符串。我期待使用match_allmatch_iter函数。
dsclose 2015年

21
免责声明:那些人只会找到不重叠的比赛
AntoineLizée16

3
@AntoineLizée,如何找到重叠的迭代?
罗刹2015年

16
@Raksha- re.search循环使用。它将返回一个Match对象。您需要将其Match.start() + 1作为循环的下一次迭代的pos参数传递re.search
ArtOfWarfare

3
如果匹配项包含多个组,findall则将返回匹配的元组列表,而不是匹配的字符串列表。
rodorgas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.