Статья Автор: Деникина Н.В., Деникин А.В.

Шпаргалка по основным функция модуля re (Python)

Основные функции re с группами и без

Функция Что делает Без групп () С группами () Когда использовать
re.search() Ищет первое совпадение Возвращает Match-объект
search(r'\d+', 'a123') → Match '123'
Match-объект с доступом к группам
search(r'(\d+)', 'a123') → Match, .group(1) = '123'
Проверить наличие шаблона
re.match() Ищет в начале строки Match или None
match(r'\d+', '123a') → Match '123'
Match с группами
match(r'(\d+)([a-z]+)', '123abc').group(1) = '123', .group(2) = 'abc'
Валидация начала строки
re.fullmatch() Вся строка должна совпадать Match или None
fullmatch(r'\d+', '123') → Match
Match с группами
fullmatch(r'(\d+)-(\d+)', '12-34') → группы '12', '34'
Полная валидация формата
re.findall() Находит все совпадения Список строк
findall(r'\d+', 'a1b2c3')['1','2','3']
Список кортежей групп
findall(r'(\d+)([a-z])', 'a1b2c')[('1','b'), ('2','c')]
Извлечь все данные простого формата
re.finditer() Находит все совпадения Итератор Match-объектов
[m.group() for m in finditer(r'\d+', 'a1b2')]['1','2']
Итератор, .group() = всё, .group(1) = группа
[m.group(1) for m in finditer(r'(\d+)', 'a1b2')]['1','2']
Нужны позиции или полные совпадения с группами
re.split() Разбивает строку Список без разделителей
split(r'\d+', 'a1b2c')['a','b','c','']
Список с разделителями
split(r'(\d+)', 'a1b2c')['a','1','b','2','c','']
Разбить строку (группы сохраняют разделители)
re.sub() Заменяет совпадения Простая замена
sub(r'\d+', 'X', 'a1b2')'aXbX'
Можно использовать группы в замене
sub(r'(\d+)', r'[\1]', 'a1b2')'a[1]b[2]'
Замена текста (группы для переиспользования)
re.subn() Заменяет + считает ('aXbX', 2)
subn(r'\d+', 'X', 'a1b2')
('a[1]b[2]', 2)
subn(r'(\d+)', r'[\1]', 'a1b2')
Замена + нужно количество замен

 

Когда какую функцию использовать

Ситуация Функция
Нужно только проверить наличие шаблона search()
Нужно извлечь простые данные без групп findall()
Нужно извлечь данные и есть группы finditer() (чтобы не потерять полное совпадение)
Нужны позиции совпадений finditer()
Нужны пары/тройки значений (имя+возраст) findall() с несколькими группами
Нужно разбить строку split() (группы сохраняют разделители)
Нужно заменить с переиспользованием sub() с группами \1, \2
Золотое правило: Если в шаблоне есть группы () и нужны полные совпадения, используй finditer()

Общие правила

Правило Что делать Зачем
1. Ленивость Используй *?, +? вместо *, + Чтобы не захватить лишнее
2. Экранирование Экранируй спецсимволы \. \$ \+ и т.д. Иначе они работают как операторы
3. Raw-строки Всегда r'pattern' Избежать проблем с \
4. Невозвратные группы (?:...) для группировки без захвата Не засорять результат
5. Якоря ^ начало, $ конец Точный контроль позиции
6. Компиляция re.compile() для многократного использования Ускорение в циклах
7. Дефис в [] В начало/конец или экранировать Иначе это диапазон
8. findall с группами Используй finditer() если нужно всё совпадение findall вернёт только группы
9. Обратные ссылки \1 в шаблоне, \1 в замене Повторяющиеся паттерны
10. Флаги re.MULTILINE, re.DOTALL, re.IGNORECASE Контроль поведения
11. Проверка None Всегда проверяй результат перед .group() Избежать ошибок
12. Границы слов \b для целых слов Не находить подстроки
Главное правило всех правил: Тестируй свои регулярки на разных примерах! Используй https://regex101.com для отладки.
Печать