Как найти все совпадения регулярного выражения в Python?
Когда я использую функцию re.search()
для поиска совпадений в тексте, программа завершает выполнение сразу после нахождения первого совпадения.
Как мне сделать так, чтобы программа продолжала поиск, пока не будут найдены ВСЕ совпадения? Существует ли отдельная функция для этой цели?
1 ответ(ов)
Метод, который можно использовать (несколько в духе начального вопроса, хотя и спустя 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']
Таким образом, вы можете легко находить все совпадения в строке, используя этот метод.
Фильтрация DataFrame pandas по критериям подстроки
Разделить строку по пробелам в Python
Простой способ удалить несколько пробелов в строке?
Проверка, соответствует ли строка шаблону
Разделить строку по запятым, игнорируя запятые внутри двойных кавычек?