Текст и регулярные выражения для извлечения данных

Половина рутины — это выдёргивание нужных кусочков из текста: телефонов, дат, сумм, артикулов. Регулярные выражения (модуль 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-документов.

Проверьте себя
1. Что извлекают круглые скобки ( ) в регулярном выражении?
AОни задают необязательную часть
BОни создают группу, значение которой можно извлечь отдельно
CОни означают повторение
DОни экранируют спецсимволы
2. Зачем перед шаблоном регулярки ставят префикс r, как в r'\d+'?
AЧтобы регулярка работала быстрее
BЧтобы строка стала сырой и обратные слеши не толковались как escape
CЧтобы включить поиск без учёта регистра
DЭто сокращение от regex