Вопрос-Ответ

How can I find all matches to a regular expression in Python?

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

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

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

Переведено автоматически
Ответ 1

Вместо этого используйте re.findall или re.finditer.

re.findall(pattern, string) возвращает список совпадающих строк.

re.finditer(pattern, string) возвращает итератор по MatchObject объектам.

Пример:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']
Ответ 2

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

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

find_all_matches(r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# ['cats', 'dogs']

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

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