Поиск всех совпадений с регулярным выражением в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для извлечения всех вхождений регулярного выражения из строки используйте функцию re.findall(). Это удобный и эффективный способ:

Python
Скопировать код
import re

совпадения = re.findall(r"шаблон", "строка_для_поиска")

Например, чтобы найти слова, начинающиеся на букву 'S':

Python
Скопировать код
совпадения = re.findall(r"\bS\w+", "The rain in Spain")

Результат: ['Spain']. Это лёгкий и производительный подход.

Кинга Идем в IT: пошаговый план для смены профессии

Увеличение производительности с помощью finditer

Для больших объемов текста или когда требуется получить дополнительные детали о найденных совпадениях, вполне подойдет re.finditer(). Данная функция возвращает итератор, который генерирует объекты MatchObject, давая возможность более гибко обрабатывать текст:

Python
Скопировать код
совпадения = re.finditer(r"\bS\w+", "The rain in Spain")
for совпадение in совпадения:
    print(совпадение.group())   # Напечатает 'Spain'. finditer – это по-настоящему профессиональный инструмент.

Извлечение информации из объектов совпадений

Объекты MatchObject, возвращаемые функцией re.finditer(), содержат полезные данные о совпадениях. Информацию из них можно извлечь с помощью методов .group(), .start(), .end() и .groups(). Вот пример использования .group():

Python
Скопировать код
совпадения = [m.group() for m in re.finditer(r"(\bS\w+)", "The rain in Spain")]

Findall и группы захвата

Если в регулярном выражении содержатся группы, re.findall() вернет именно их. Если групп несколько, возвращается список кортежей:

Python
Скопировать код
совпадения = re.findall(r"(\bT\w+)\s(\bS\w+)", "The rain in Spain stays mainly in the plain")

В результате получим: [('The', 'Spain'), ('The', 'stays')].

Визуализация

Можно представить применение re.findall() или re.finditer() как сеть, которая ловит рыбу в море текста. Вот как выглядит этот великолепный улов:

Markdown
Скопировать код
Море текста: "🌊🐟🐠🌊🦀🌊🐠🌊🐙🌊"
Сеть регулярных выражений: "Ловим все 🐠"

Улов: [🐠, 🐠]

Воспользуйтесь re.findall(), чтобы поймать все совпадения по заданному шаблону:

Python
Скопировать код
import re
pattern = re.compile("🐠")
совпадения = pattern.findall("🌊🐟🐠🌊🦀🌊🐠🌊🐙🌊")  # "Одна рыбка, две рыбки, красная рыбка, синяя рыбка" — почти как в произведении Доктора Сьюза.

Каждый символ 🐠 здесь представляет совпадение. Отличный результат!

Будьте внимательны с жадностью регулярных выражений

Регулярные выражения могут быть излишне жадными, что приводит к нежелательным результатам. Чтобы избежать этой жадности, используйте ленивый квантификатор ?:

Python
Скопировать код
# Жадный поиск
совпадения = re.findall(r"<.*>", "<tag>содержимое</tag>")
# Вернет: ['<tag>содержимое</tag>']

# Нежадный поиск
совпадения = re.findall(r"<.*?>", "<tag>содержимое</tag>")
# Вернет: ['<tag>', '</tag>']
# Жадность была побеждена!

Флаги: тайные специи регулярных выражений

Использование флагов, например re.IGNORECASE, может радикально изменить поведение поиска. Считайте их как тайные ингредиенты при достижении выдающихся результатов:

Python
Скопировать код
совпадения = re.findall(r"spain", "The rain in Spain", re.IGNORECASE)
# Вернет: ['Spain']

Укрощение зверя под названием Юникод

Работа с Юникодом в регулярных выражениях требует особых навыков. Используйте флаг re.UNICODE, чтобы регулярное выражение правильно обрабатывало Юникод-символы:

Python
Скопировать код
совпадения = re.findall(r"\w+", "café", re.UNICODE)
# Радуемся результату: ['café']

Полезные материалы

  1. re — операции с регулярными выражениями — документация Python 3.12.2 — Официальная документация Python относительно функции re.findall().
  2. Использование регулярных выражений в Python — документация Python 3.12.2 — Обучающее пособие, котоое поможет овладеть основами регулярных выражений в Python.
  3. Модуль re в Python – руководство по RegEx — Обстоятельный обзор различных аспектов использования регулярных выражений в Python.
  4. Регулярные выражения: регэксы в Python (Часть 1) – Real Python — Учебник от Real Python, полагающийся на понимание и соответствующее использование регулярных выражений в Python.
  5. RegEx в Python — Учебник от W3Schools с понятными и пошаговыми примерами регулярных выражений.
  6. Pythex: редактор регулярных выражений Python — Онлайн-инструмент для экспериментов и проверки регулярных выражений на Python.