Поиск всех совпадений с регулярным выражением в Python
Быстрый ответ
Для извлечения всех вхождений регулярного выражения из строки используйте функцию re.findall()
. Это удобный и эффективный способ:
import re
совпадения = re.findall(r"шаблон", "строка_для_поиска")
Например, чтобы найти слова, начинающиеся на букву 'S':
совпадения = re.findall(r"\bS\w+", "The rain in Spain")
Результат: ['Spain']
. Это лёгкий и производительный подход.
Увеличение производительности с помощью finditer
Для больших объемов текста или когда требуется получить дополнительные детали о найденных совпадениях, вполне подойдет re.finditer()
. Данная функция возвращает итератор, который генерирует объекты MatchObject
, давая возможность более гибко обрабатывать текст:
совпадения = re.finditer(r"\bS\w+", "The rain in Spain")
for совпадение in совпадения:
print(совпадение.group()) # Напечатает 'Spain'. finditer – это по-настоящему профессиональный инструмент.
Извлечение информации из объектов совпадений
Объекты MatchObject
, возвращаемые функцией re.finditer()
, содержат полезные данные о совпадениях. Информацию из них можно извлечь с помощью методов .group()
, .start()
, .end()
и .groups()
. Вот пример использования .group()
:
совпадения = [m.group() for m in re.finditer(r"(\bS\w+)", "The rain in Spain")]
Findall и группы захвата
Если в регулярном выражении содержатся группы, re.findall()
вернет именно их. Если групп несколько, возвращается список кортежей:
совпадения = 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()
как сеть, которая ловит рыбу в море текста. Вот как выглядит этот великолепный улов:
Море текста: "🌊🐟🐠🌊🦀🌊🐠🌊🐙🌊"
Сеть регулярных выражений: "Ловим все 🐠"
Улов: [🐠, 🐠]
Воспользуйтесь re.findall()
, чтобы поймать все совпадения по заданному шаблону:
import re
pattern = re.compile("🐠")
совпадения = pattern.findall("🌊🐟🐠🌊🦀🌊🐠🌊🐙🌊") # "Одна рыбка, две рыбки, красная рыбка, синяя рыбка" — почти как в произведении Доктора Сьюза.
Каждый символ 🐠 здесь представляет совпадение. Отличный результат!
Будьте внимательны с жадностью регулярных выражений
Регулярные выражения могут быть излишне жадными, что приводит к нежелательным результатам. Чтобы избежать этой жадности, используйте ленивый квантификатор ?
:
# Жадный поиск
совпадения = re.findall(r"<.*>", "<tag>содержимое</tag>")
# Вернет: ['<tag>содержимое</tag>']
# Нежадный поиск
совпадения = re.findall(r"<.*?>", "<tag>содержимое</tag>")
# Вернет: ['<tag>', '</tag>']
# Жадность была побеждена!
Флаги: тайные специи регулярных выражений
Использование флагов, например re.IGNORECASE
, может радикально изменить поведение поиска. Считайте их как тайные ингредиенты при достижении выдающихся результатов:
совпадения = re.findall(r"spain", "The rain in Spain", re.IGNORECASE)
# Вернет: ['Spain']
Укрощение зверя под названием Юникод
Работа с Юникодом в регулярных выражениях требует особых навыков. Используйте флаг re.UNICODE
, чтобы регулярное выражение правильно обрабатывало Юникод-символы:
совпадения = re.findall(r"\w+", "café", re.UNICODE)
# Радуемся результату: ['café']
Полезные материалы
- re — операции с регулярными выражениями — документация Python 3.12.2 — Официальная документация Python относительно функции
re.findall()
. - Использование регулярных выражений в Python — документация Python 3.12.2 — Обучающее пособие, котоое поможет овладеть основами регулярных выражений в Python.
- Модуль re в Python – руководство по RegEx — Обстоятельный обзор различных аспектов использования регулярных выражений в Python.
- Регулярные выражения: регэксы в Python (Часть 1) – Real Python — Учебник от Real Python, полагающийся на понимание и соответствующее использование регулярных выражений в Python.
- RegEx в Python — Учебник от W3Schools с понятными и пошаговыми примерами регулярных выражений.
- Pythex: редактор регулярных выражений Python — Онлайн-инструмент для экспериментов и проверки регулярных выражений на Python.