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

Узнайте, сколько раз регулярное выражение совпадает с строкой в ​​Python

Есть ли способ узнать, сколько совпадений регулярного выражения находится в строке в Python? Например, если у меня есть строка "It actually happened when it acted out of turn."

Я хочу знать, сколько раз "t a" появляется в строке. В этой строке "t a" появляется дважды. Я хочу, чтобы моя функция сказала мне, что она появилась дважды. Возможно ли это?

4b9b3361

Ответ 1

Существующие решения, основанные на findall, хороши для совпадающих совпадений (и, несомненно, оптимальных, за исключением, может быть, большого количества совпадений), хотя альтернативы, такие как sum(1 for m in re.finditer(thepattern, thestring)) (чтобы избежать материализации списка, когда все, что вам нужно about is count) также вполне возможны. В некотором смысле особое значение имеет использование subn и игнорирование полученной строки...:

def countnonoverlappingrematches(pattern, thestring):
  return re.subn(pattern, '', thestring)[1]

единственное реальное преимущество этой последней идеи пришло бы, если бы вы только заботились о том, чтобы считать (скажем) до 100 матчей; то re.subn(pattern, '', thestring, 100)[1] может быть практичным (возврат 100, есть ли 100 совпадений или 1000 или даже большее число).

Для подсчета совпадений перекрытия требуется написать больше кода, потому что все встроенные функции сосредоточены на совпадениях, не совпадающих. Также существует проблема определения, например, с шаблоном 'a+' и строкой 'aa', считаете ли вы, что это всего лишь одно совпадение, или три (первый a, второй, оба) или...?

Предположим, например, что вы хотите, чтобы совпадающие совпадения начинались в отдельных точках в строке (что тогда дало бы TWO-совпадения для примера в предыдущем абзаце):

def countoverlappingdistinct(pattern, thestring):
  total = 0
  start = 0
  there = re.compile(pattern)
  while True:
    mo = there.search(thestring, start)
    if mo is None: return total
    total += 1
    start = 1 + mo.start()

Обратите внимание, что в этом случае вам необходимо скомпилировать шаблон в объект RE: function re.search не принимает аргумент start (начальная позиция для поиска), как метод search делает, d нужно нарезать строку, когда вы идете - определенно больше усилий, чем просто запуск следующего поиска в следующей возможной отдельной начальной точке, что я и делаю в этой функции.

Ответ 2

import re
len(re.findall(pattern, string_to_search))

Ответ 3

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

>>> s = "It actually happened when it acted out of turn."
>>> s.count('t a')
2

Которые возвращают количество неперекрывающихся вхождений подстроки

Ответ 4

Вы пробовали это?

 len( pattern.findall(source) )

Ответ 5

Вы можете найти совпадающие совпадения с помощью незагружаемого подшаблона:

def count_overlapping(pattern, string):
    return len(re.findall("(?=%s)" % pattern, string))

Ответ 6

import re
print len(re.findall(r'ab',u'ababababa'))

Ответ 7

Чтобы избежать создания списка совпадений, вы также можете использовать re.sub с возможностью замены в качестве замены. Он будет вызываться в каждом матче, увеличивая внутренний счетчик.

class Counter(object):
    def __init__(self):
        self.matched = 0
    def __call__(self, matchobj):
        self.matched += 1

counter = Counter()
re.sub(some_pattern, counter, text)

print counter.matched