Ответ 1
Если вы знаете, что вам нужны все совпадения, вы можете использовать функцию re.findall
. Он вернет список всех совпадений. Тогда вы можете просто сделать len(result)
для количества совпадений.
Я использую функцию finditer
в модуле re
, чтобы соответствовать некоторым вещам, и все работает.
Теперь мне нужно узнать, сколько у меня совпадений. Возможно ли это без повторения итератора дважды? (один, чтобы узнать количество, а затем реальную итерацию)
Некоторый код:
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)
.
Другой вариант, если вам просто нужно знать общий счет после выполнения каких-либо объектов совпадения, заключается в использовании
matches = enumerate(re.finditer(...))
который вернет пару (index, match)
для каждого из исходных совпадений. Итак, вы можете просто сохранить первый элемент каждого кортежа в некоторой переменной.
Но если вам нужна длина в первую очередь, и вам нужны объекты соответствия, а не только строки, вы должны просто сделать
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()
(не соответствующие перекрывающимся экземплярам), используйте этот метод.
#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
В те моменты, когда вы действительно хотите избежать создания списков:
import re
import operator
from functools import reduce
count = reduce(operator.add, (1 for _ in re.finditer(my_pattern, my_string)))
Иногда вам может понадобиться работать с огромными строками. Это может помочь.
Я знаю, что это немного устарело, но это краткая функция для подсчета шаблонов регулярных выражений.
def regex_cnt(string, pattern):
return len(re.findall(pattern, string))
string = 'abc123'
regex_cnt(string, '[0-9]')