5

Как найти все совпадения регулярного выражения в Python?

14

Когда я использую функцию re.search() для поиска совпадений в тексте, программа завершает выполнение сразу после нахождения первого совпадения.

Как мне сделать так, чтобы программа продолжала поиск, пока не будут найдены ВСЕ совпадения? Существует ли отдельная функция для этой цели?

1 ответ(ов)

0

Метод, который можно использовать (несколько в духе начального вопроса, хотя и спустя 13 лет), заключается в компиляции шаблона и вызове search() на скомпилированном шаблоне с последующим смещением по строке. Это немного многословно, но если вы не хотите использовать просмотр вперед и т.д., или если хотите более явно производить поиск по строке, вы можете воспользоваться следующей функцией.

import re

def find_all_matches(pattern, string, group=0):
    pat = re.compile(pattern)
    pos = 0
    out = []
    while m := pat.search(string, pos):
        pos = m.start() + 1
        out.append(m[group])
    return out

pat = r'all (.*?) are'
s = 'all cats are smarter than dogs, all dogs are dumber than cats'
find_all_matches(pat, s)           # ['all cats are', 'all dogs are']
find_all_matches(pat, s, group=1)  # ['cats', 'dogs']

Этот подход также работает для перекрывающихся совпадений:

find_all_matches(r'(\w\w)', "hello")  # ['he', 'el', 'll', 'lo']

Таким образом, вы можете легко находить все совпадения в строке, используя этот метод.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь