Количество совпадений регулярных выражений - PullRequest
57 голосов
/ 09 октября 2010

Я использую функцию finditer в модуле re, чтобы соответствовать некоторым вещам, и все работает.

Теперь мне нужно выяснить, сколько совпадений у меня получилось, возможно ли это без повторения итератора дважды? (один, чтобы узнать количество, а затем реальная итерация)

Edit: По запросу какой-то код:

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

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

Ответы [ 6 ]

80 голосов
/ 09 октября 2010

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

9 голосов
/ 09 октября 2010

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

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

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

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

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

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

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

matches = tuple(re.finditer(...))
4 голосов
/ 16 сентября 2016
#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
4 голосов
/ 09 октября 2010

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

1 голос
/ 12 октября 2018

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

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

string = 'abc123'

regex_cnt(string, '[0-9]')
1 голос
/ 18 ноября 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...