正则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。 这可能有帮助。