How can I find all matches to a regular expression in Python?
Как я могу найти все соответствия регулярному выражению в Python?
Когда я использую функцию re.search() для поиска совпадений в блоке текста, программа завершает работу, как только находит первое совпадение в блоке текста.
Как мне делать это повторно, когда программа не останавливается, пока не будут найдены ВСЕ соответствия? Есть ли отдельная функция для этого?
Переведено автоматически
Ответ 1
Вместо этого используйте re.findall или re.finditer.
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() скомпилированного шаблона и перемещении по шаблону. Это немного многословно, но если вы ненавидите предварительный просмотр и т.д., то вы можете использовать следующую функцию.
deffind_all_matches(pattern, string): pat = re.compile(pattern) pos = 0 out = [] while (match := pat.search(string, pos)) isnotNone: 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']