Текст и регулярные выражения для извлечения данных
Половина рутины — это выдёргивание нужных кусочков из текста: телефонов, дат, сумм, артикулов. Регулярные выражения (модуль re) делают это одной строкой-шаблоном.
Суть: регулярка — это шаблон для поиска по тексту.\d— цифра,+— один и более, скобки( )выделяют группу для извлечения.
Данные редко приходят аккуратной таблицей. Чаще это письмо, лог или выгрузка, где нужное спрятано в тексте: «заказ #4821 на сумму 15 600 руб от 22.06.2026». Чтобы вытащить номер, сумму и дату, нужен инструмент поиска по образцу — регулярные выражения. Это мини-язык описания шаблонов текста, встроенный в Python через модуль re.
Базовые кирпичики шаблона: \d — любая цифра, \w — буква/цифра, . — любой символ, + — «один и более раз», * — «ноль и более». Круглые скобки создают группу: то, что в них, можно потом извлечь отдельно. Модуль re — часть stdlib, поэтому всё это работает в браузере.
Попробуй сам ▶
import re
text = '''Заказ #4821 на сумму 15600 руб от 22.06.2026.
Заказ #4822 на сумму 7300 руб от 23.06.2026.
Контакт: +7 (999) 123-45-67'''
# Группы в скобках -> то, что извлекаем
pattern = r'#(\d+) на сумму (\d+) руб от (\d{2}\.\d{2}\.\d{4})'
for num, amount, date in re.findall(pattern, text):
print(f'Заказ {num}: {int(amount):>6} руб, дата {date}')
# Поиск телефона отдельным шаблоном
phone = re.search(r'\+7[\s()\d-]+', text)
print('Телефон:', phone.group().strip())re.findall возвращает все совпадения сразу; если в шаблоне есть группы — он отдаёт кортежи их значений. re.search находит первое совпадение и даёт объект, у которого .group() возвращает найденный текст. Это два самых частых метода.
АНАТОМИЯ РЕГУЛЯРКИ #(\d+) на сумму (\d+) руб | | | | +- группа 1: цифры (номер) | +- группа 2: цифры (сумма) +- литерал '#': ищется буквально \d = цифра + = 1 и более ( ) = группа
Обратите внимание на префикс r'' перед строкой шаблона. Это «сырая» строка, в которой обратный слеш не превращается в спецсимвол. Без неё \d Python мог бы попытаться истолковать как escape-последовательность.
Полезно освоить и именованные группы — они делают сложные шаблоны читаемыми. Запись (?P<amount>\d+) создаёт группу с именем amount, к которой потом обращаются по имени через match.group('amount'), а не по номеру. В шаблоне с пятью группами это спасает от путаницы: вместо загадочного group(4) вы пишете осмысленное имя. Ещё один частый помощник — re.sub, который не ищет, а заменяет по шаблону: им чистят текст от лишних пробелов, маскируют номера карт, нормализуют формат дат. Вместе поиск и замена покрывают большинство задач обработки неструктурированного текста.
Как работает под капотом
Когда вы передаёте шаблон в re, он компилируется в конечный автомат — структуру, которая «проходит» по тексту символ за символом и решает, совпал ли образец. Если один шаблон используется много раз, его стоит скомпилировать заранее через re.compile — тогда автомат строится один раз, а не на каждый вызов.
Квантификаторы вроде + по умолчанию жадные: захватывают как можно больше текста. Иногда это ловит лишнее — тогда добавляют ? (+?), делая их «ленивыми», чтобы брали минимум. Понимание жадности спасает от загадочных багов в шаблонах.
Частые ошибки
- Забыть префикс
r''. Без него обратные слеши в шаблоне толкуются неправильно. - Жадность вместо лени.
.+может проглотить больше, чем нужно; используйте.+?, когда нужен минимум. - Парсить регуляркой то, что лучше парсится иначе. HTML и сложные форматы — не для regex; берите специализированные парсеры.
Best practices
- Всегда пишите шаблоны как сырые строки
r'...'. - Часто используемые шаблоны компилируйте через
re.compile. - Тестируйте шаблон на крайних случаях: пустой текст, лишние пробелы, неожиданный формат.
Итоги. Регулярные выражения извлекают структурированные данные из хаоса текста: шаблоны, группы, findall и search. Помните про сырые строки и жадность. Дальше применим это к содержимому реальных PDF-документов.