Подтвердить что ты не робот

Количество совпадений регулярных выражений

Я использую функцию 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

Все работает, мне просто нужно получить количество совпадений до цикла.

4b9b3361

Ответ 1

Если вы знаете, что вам нужны все совпадения, вы можете использовать функцию re.findall. Он вернет список всех совпадений. Тогда вы можете просто сделать len(result) для количества совпадений.

Ответ 2

Если вам всегда нужно знать длину, и вам просто нужен контент матча, а не другая информация, вы можете использовать re.findall. В противном случае, если вам нужна только длина, вы можете использовать, например,

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

чтобы сохранить итерацию совпадений в многоразовом кортеже. Тогда просто len(matches).

Другой вариант, если вам просто нужно знать общий счет после выполнения каких-либо объектов совпадения, заключается в использовании

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

который вернет пару (index, match) для каждого из исходных совпадений. Итак, вы можете просто сохранить первый элемент каждого кортежа в некоторой переменной.

Но если вам нужна длина в первую очередь, и вам нужны объекты соответствия, а не только строки, вы должны просто сделать

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

Ответ 3

Если вы обнаружите, что вам нужно придерживаться 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() (не соответствующие перекрывающимся экземплярам), используйте этот метод.

Ответ 4

#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

Ответ 5

В те моменты, когда вы действительно хотите избежать создания списков:

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

Иногда вам может понадобиться работать с огромными строками. Это может помочь.

Ответ 6

Я знаю, что это немного устарело, но это краткая функция для подсчета шаблонов регулярных выражений.

def regex_cnt(string, pattern):
    return len(re.findall(pattern, string))

string = 'abc123'

regex_cnt(string, '[0-9]')