Объяснение регулярных выражений Python (2026)
Regex — самая опасная функция Python. Это не так уж и сложно — но 80% руководств сначала загружают теорию (\d, \w, жадный против ленивого), прежде чем показать вам один шаблон, который вы действительно будете использовать в реальном коде. Этот урок переворачивает это.
Мы рассмотрим: основы модуля re, пять шаблонов, которые охватывают 90% реальной работы, когда re.compile действительно помогает, именованные группы вместо нумерованных и четыре случая, когда регулярное выражение является НЕПРАВИЛЬНЫМ инструментом.
Модуль за 60 секунд
Все находится в модуле stdlib re. Три функции удовлетворяют большинство потребностей:
Правило: используйте «re.search», если сомневаетесь. re.match проверяет только начало; забыв, что это приводит к «моему регулярному выражению не соответствует!» 30 минут потеряно.
Необработанные строки — всегда используйте их
Префикс r"...." отключает интерпретацию обратной косой черты. Без него "\d" становится "\\d" в Python, который механизм регулярных выражений видит как \d — тот же результат, но только случайно и только для \d. "\n" в регулярном выражении — это новая строка, а не два символа ` + n`.
Мышечная память: каждый литерал регулярного выражения начинается с «r». Никаких исключений.
5 шаблонов, которые охватывают 90% реальной работы
1. Извлечь все целые числа из текста
Примечание. 199.99 разделяется на ['199', '99'] — \d+ не пересекает точку. Используйте r"\d+(?:\.\d+)?" для необязательных десятичных знаков:
2. Нормализовать пробелы
\s+ соответствует любому набору пробелов/табуляции/новой строки. Замените одним пробелом, зачистите края. Это ответ Python на sed -E 's/[[:space:]]+/ /g'.
3. Извлеките имя хоста из URL-адреса
Круглые скобки создают группу захвата; .group(1) возвращает свое содержимое. [^/:]+ = "один или несколько символов, отличных от / или :" — останавливается на разделителе порта ИЛИ пути.
Для анализа рабочих URL-адресов используйте urllib.parse.urlparse (обрабатывает крайние случаи, такие как информация о пользователе + IPv6). Regex предназначен для быстрого извлечения.
4. Неправильная проверка электронной почты
НЕТ регулярного выражения, которое полностью проверяет электронную почту в соответствии с RFC 5322. Любой, кто говорит вам обратное, что-то продает. Но этот ловит 99% реальных адресов, не отклоняя ложно хорошие:
Якоря (^ и $) обеспечивают полное совпадение строк. Без них будет соответствовать "foo@bar" внутри более крупного предложения.
Производство: отправьте электронное письмо с подтверждением. Это ЕДИНСТВЕННЫЙ надежный валидатор электронной почты.
5. Именованные группы захвата
Нумерованные группы ((...) + .group(1)) подходят для 2-3 захватов. Помимо этого, выигрывают имена:
.groupdict() возвращает список всех именованных групп. Добавляйте/изменяйте порядок групп, не нарушая каждый сайт вызова, который ссылается на .group(3).
re.compile — когда это действительно помогает
Библиотека stdlib поддерживает небольшой кэш скомпилированных шаблонов (размер по умолчанию 512), поэтому одноразовые вызовы re.search(pattern, text) фактически бесплатны после первого попадания. re.compile явно помогает, когда:
1. Узор используется внутри плотного цикла (миллионы спичек).
2. Вы хотите сохранить шаблон как константу уровня модуля для возможности grep.
3. Вам нужны .finditer(), .pattern, .flags для скомпилированного объекта.
Не перекомпилируйте. Каждая повторная компиляция на уровне модуля добавляет небольшие затраты времени на импорт.
Общие флаги
Объедините с |: re.IGNORECASE | re.MULTILINE.
Когда регулярное выражение — НЕПРАВИЛЬНЫЙ инструмент
1. Парсинг HTML/XML → используйте настоящий парсер
Классическому ответу Stack Overflow уже 20 лет, и он все еще верен.
2. Анализ JSON → используйте json
Модуль json обрабатывает вложенные кавычки, экранированные символы, Unicode и все крайние случаи RFC 8259. Анализ JSON с помощью регулярных выражений является сигналом анти-шаблона.
3. Анализ дат → используйте dateutil или datetime.strptime
dateutil.parser.parse("2026-07-30") принимает любой формат, который может ввести человек. datetime.strptime эффективно обрабатывает известные форматы. Оба обрабатывают часовые пояса. Regex придется изобрести все это заново.
4. Вложенные/рекурсивные шаблоны → используйте генератор синтаксического анализатора
Совпадающие скобки, вложенный JSON, сбалансированные выражения формально выходят за рамки возможностей регулярных выражений (территория бесконтекстной грамматики). Используйте pyparsing/lark/ANTLR — или просто пройдитесь по строке небольшим парсером.
Отладка регулярного выражения
Используйте regex101.com (выберите вариант «Python»). Вставьте шаблон + образец текста; он выделяет совпадения в реальном времени, объясняет каждый метасимвол и показывает именованные группы. Самый быстрый способ интуитивного изучения регулярных выражений.
Для отладки на уровне кода re.DEBUG печатает скомпилированный конечный автомат:
Практика
Напишите регулярное выражение для каждого. Решения ниже.
1. Извлеките номер версии из «Python 3.13.2 (main, 15 января 2026, 10:32:11)» — должно вернуться «3.13.2».
2. Разделите "яблоко,банан;вишневый апельсин" по любому разделителю (,, ; или пробел).
3. Перепишите foo.bar_baz-123 как FOO.BAR_BAZ-123 (только заглавные буквы, оставьте цифры и знаки препинания).
Решения:
Regex становится суперсилой, когда вы преодолеваете первые 10 шаблонов. Хитрость заключается в том, чтобы построить мышечную память на пяти вышеперечисленных упражнениях — они охватывают 90% реальной работы. Воспользуйтесь настоящим парсером в тот момент, когда вы обнаружите, что пишете обратные ссылки, чтобы сбалансировать круглые скобки.
Следующий шаг: уроки по регулярному выражению и обработке текста в разделе «Автоматизация» — попрактикуйтесь в файлах журналов, данных CSV и задачах очистки веб-страниц на реальном Python, работающем в вашем браузере.