Як я можу знайти всі збіги до регулярного виразу в Python?


312

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

Як це робити неодноразово, коли програма не зупиняється, поки не знайдені ВСІ відповідники? Чи є для цього окрема функція?


Рекурсивні РЕ - це інший звір. Ви хочете повторити пошук.
outis

Відповіді:


545

Використовуйте 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']

18
finditerбуло те, що я шукав. Я здивований, що один повертає об'єкти Match, а інші рядки. Я очікував використовувати функцію match_allабо match_iter.
dsclose

21
ВІДМОВА ВІДПОВІДАЛЬНО: ті знайдуть лише матчі, що не перетинаються
Антуан Лізе

3
@ AntoineLizée, як можна знайти ітерації, які перекриваються?
Ракша

16
@Raksha - використовувати re.searchв циклі. Він поверне Matchоб’єкт. Ви хочете передати його Match.start() + 1як posаргумент для re.searchнаступної ітерації циклу.
ArtOfWarfare

3
Якщо збіг містить більше однієї групи, findallповерне список відповідних кортежів, а не список відповідних рядків.
rodorgas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.