正则表达式匹配次数
我正在使用 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)
就可以得到匹配的数量。