正则表达式匹配次数

89 投票
7 回答
136705 浏览
提问于 2025-04-16 05:14

我正在使用 re 模块里的 finditer 函数来匹配一些内容,一切都运行得很好。

现在我想知道我找到了多少个匹配项。有没有办法在不重复遍历这个迭代器两次的情况下做到这一点?(一次是为了计算数量,另一次才是真正的遍历)

这里有一些代码:

imageMatches = re.finditer("<img src\=\"(?P<path>[-/\w\.]+)\"", response[2])
# <Here I need to get the number of matches>
for imageMatch in imageMatches:
    doStuff

一切都正常,我只需要在循环之前得到匹配的数量。

7 个回答

11
#An example for counting matched groups
import re

pattern = re.compile(r'(\w+).(\d+).(\w+).(\w+)', re.IGNORECASE)
search_str = "My 11 Char String"

res = re.match(pattern, search_str)
print(len(res.groups())) # len = 4  
print (res.group(1) ) #My
print (res.group(2) ) #11
print (res.group(3) ) #Char
print (res.group(4) ) #String

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

15

如果你总是需要知道匹配的长度,并且只关心匹配的内容,而不是其他信息,那么你可以使用 re.findall。否则,如果你只是偶尔需要长度,可以使用例如:

matches = re.finditer(...)
...
matches = tuple(matches)

将匹配的结果存储在一个可以重复使用的元组中。然后只需使用 len(matches) 来获取长度。

另外一种选择是,如果你在处理匹配对象后只需要知道总的数量,可以使用:

matches = enumerate(re.finditer(...))

这样会为每个原始匹配返回一个 (index, match) 的组合。然后你可以将每个元组的第一个元素存储在某个变量中。

但是如果你首先需要长度,并且需要匹配对象而不仅仅是字符串,那么你应该直接使用:

matches = tuple(re.finditer(...))
131

如果你知道自己想要获取所有匹配的结果,可以使用 re.findall 这个函数。它会返回一个包含所有匹配结果的列表。然后你只需要用 len(result) 就可以得到匹配的数量。

撰写回答