Мастерство регулярных выражений Python: re.match(), re.search(), re.findall() — практические примеры
Что такое регулярное выражение в Python?
Регулярное выражение (regex) — компактное текстовое описание, указывающее Python, как находить шаблоны внутри строки. Регулярки незаменимы для извлечения данных, валидации и трансформации в кодовых базах, логах, конфигах и веб-скрапинге.
В Python модуль re поставляется с интерпретатором и предоставляет богатый API для компиляции паттернов, поиска и замены текста. Будь то фильтрация пользовательского ввода, парсинг логов или скрапинг контента — твёрдое понимание основ regex экономит время и снижает баги.
Основные концепции Regex
- Литеральные символы — совпадают с точным написанным текстом.
- Метасимволы — специальные символы, описывающие классы, диапазоны или квантификаторы (например,
\d,\w,+,?,*). - Якоря —
^и$привязывают паттерн к началу или концу строки. - Квантификаторы — задают, сколько раз токен может повторяться.
- Группы и альтернация — захватывают под-совпадения и позволяют множественные варианты.
- Флаги — меняют поведение паттерна (нечуткость к регистру, многострочность и т.д.).
Таблица распространённых идентификаторов
| Идентификатор | Описание | Whitespace | Спец. экранирование |
|---|---|---|---|
| \d | Любая цифра (0‑9) | \n | ., +, *, ?, [], $, ^, (, ), {}, |, \ |
| \D | Не цифра | \s | |
| \s | Пробел, таб, перевод строки и т.д. | \t | |
| \S | Не пробел | \e | |
| \w | Буквенно-цифровые + подчёркивание | \r | |
| \W | Не буквенно-цифровые (кроме _) | \f | |
| . | Любой символ, кроме новой строки | — | |
| \b | Граница слова | — | |
| \. | Буквальная точка | — | |
| \{x} | Ровно x вхождений | — |
Начало работы с re
import re
Модуль re входит в стандартную библиотеку и не требует внешних зависимостей. Типичные сценарии:
- Валидация строк (email, телефоны)
- Извлечение данных из неструктурированного текста
- Автоматизированный веб-скрапинг
Пример 1: \w+ и ^
^— якорь в начале строки.\w+— один или более «word» символов (буквы, цифры, подчёркивание).
Их комбинация захватывает первое слово строки:
import re sample = "guru99, education is fun" result = re.findall(r"^\w+", sample) print(result) # Output: ['guru99']
Без + вернётся только первый символ: ["g"].
Пример 2: Разделение по пробелам с \s
Функция re.split() делит строку там, где совпадает паттерн. Использование \s разбивает по любому whitespace-символу.
import re text = "we are splitting the words" print(re.split(r"\s", text)) # ['we', 'are', 'splitting', 'the', 'words']
Если обратный слэш опущен, s трактуется как литерал, вызывая разбиение по каждому символу s.
Обзор методов Regex
re.match()— проверяет совпадение только в начале строки.re.search()— сканирует всю строку и возвращает первое совпадение.re.findall()— возвращает список всех непересекающихся совпадений.
Использование re.match()
import re text = "guru99 is a great platform" match = re.match(r"^\w+", text) print(match.group() if match else "No match") # Output: guru99
Использование re.search()
import re
text = "Software Testing is fun"
for pattern in ["Software testing", "guru99"]:
found = re.search(pattern, text, re.IGNORECASE)
print(f"Looking for '{pattern}' in '{text}' - {'found a match!' if found else 'no match'}")
Использование re.findall()
import re
emails = "guru99@google.com, careerguru99@hotmail.com, users@yahoomail.com"
found = re.findall(r"[\w\.-]+@[\w\.-]+", emails)
for e in found:
print(e)
Флаги Regex
Флаги модифицируют поведение паттерна. Частые флаги:
| Флаг | Описание |
|---|---|
| re.M (re.MULTILINE) | ^ и $ совпадают с началом и концом каждой строки. |
| re.I (re.IGNORECASE) | Игнорировать различия в регистре. |
| re.S (re.DOTALL) | Точка совпадает с переводами строки. |
| re.U (re.UNICODE) | Unicode-aware классы символов. |
| re.L (re.LOCALE) | Классы зависят от текущей локали. |
| re.X (re.VERBOSE) | Позволяют пробелы и комментарии в паттерне. |
Пример многострочности
import re text = """guru99 careerguru99 selenium""" print(re.findall(r"^\w", text)) # ['g'] print(re.findall(r"^\w", text, re.MULTILINE)) # ['g', 'c', 's']
Совместимость с Python 2
Все примеры выше написаны для Python 3. Если нужно запустить под Python 2, замените print() на синтаксис Python 2 и убедитесь, что модуль re импортирован так же.
Резюме
Мастерство Python regex даёт мощный инструментарий для обработки текста:
- Используйте
re.match()для паттернов, привязанных к началу. - Используйте
re.search()для глобального поиска. - Используйте
re.findall()для извлечения всех совпадений. - Применяйте флаги (например,
re.IGNORECASE,re.MULTILINE) для тонкой настройки. - Помните тестировать паттерны на Regex101 или похожих инструментах перед деплоем.
Python
- Мастерство метода strip() в Python: подробное руководство и практические примеры
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Мастерство строк форматирования format() в Python: понятные примеры
- Python len(): практическое руководство по измерению длины объектов
- Мастерство метода String.find() в Python: синтаксис, примеры и альтернативы
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Counter в collections Python: эффективное подсчёт, обновление и арифметические операции
- Python list.count(): экспертное руководство с практическими примерами