正则expression式匹配的数量

我在re模块中使用finditer函数来匹配一些东西,一切正常。

现在我需要找出我有多less匹配,有没有可能没有循环遍历迭代器两次? (一个找出计数,然后真正的迭代)

编辑:按要求,一些代码:

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

一切正常,我只需要获得循环之前的匹配数。

如果你知道你会想要所有的匹配,你可以使用re.findall函数。 它将返回所有匹配的列表。 然后,你可以做len(result)的比赛数量。

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

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

将匹配的迭代存储在可重用的元组中。 然后只要len(matches)

另一个select,如果你只是需要知道总数与匹配对象做任何事情,是使用

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

这将为每个原始匹配返回一个(index, match)对。 那么你可以将每个元组的第一个元素存储在某个variables中。

但是如果你首先需要这个长度,而你需要匹配对象而不是只是string,那么你应该这样做

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

如果你发现你需要坚持使用finditer() ,你可以简单地使用一个计数器,而你迭代迭代器。

例:

 >>> from re import * >>> pattern = compile(r'.ython') >>> string = 'i like python jython and dython (whatever that is)' >>> iterator = finditer(pattern, string) >>> count = 0 >>> for match in iterator: count +=1 >>> count 3 

如果您需要finditer() (不匹配重叠实例)的function,请使用此方法。

 #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 

对于那些真正想要避免构build列表的时刻:

 import re import operator from functools import reduce count = reduce(operator.add, (1 for _ in re.finditer(my_pattern, my_string))) 

有时你可能需要操作巨大的string。 这可能有帮助。