Учебник Регулярные выражения для начинающих
Регулярные выражения (regex) — компактный язык описания текстовых шаблонов. С их помощью одной строкой проверяют формат email, вытаскивают числа и даты из текста, чистят и переформатируют данные, парсят логи. Этот навык универсален: один и тот же синтаксис работает в Python, JavaScript, Java, Go, в редакторах кода и утилитах вроде grep.
Курс ведёт от простого к сложному: от первого вызова re.search до опережающих проверок и борьбы с катастрофическим бэктрекингом. Все примеры — на Python (модуль re входит в стандартную библиотеку), и почти каждый можно запустить прямо в браузере, поменять паттерн и сразу увидеть результат. После курса вы будете уверенно читать и писать регулярки и понимать, где они уместны, а где лучше взять обычный парсер.
Курс «Регулярные выражения» состоит из 6 разделов и 23 уроков: Введение и базовый синтаксис, Классы символов и кванторы, Группы и захват, Поиск и замена, Продвинутые приёмы и Практика и кросс-язык. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение и базовый синтаксис
- Что такое регулярные выражения и зачем они нужны
Регулярное выражение — это шаблон для поиска в тексте. Разбираем, какие задачи они решают и почему этот навык универсален для любого языка.
- Модуль re: search, match, fullmatch и объект Match
Основные функции модуля re в Python: search, match, fullmatch. Чем они отличаются и как читать объект Match через group, start, end и span.
- Литералы и метасимволы, точка и экранирование
Различаем литералы и метасимволы в регулярках, разбираем точку как «любой символ» и учимся экранировать спецсимволы обратным слэшем.
- Флаги: IGNORECASE, MULTILINE, DOTALL
Флаги регулярных выражений в Python: re.IGNORECASE для регистронезависимости, re.MULTILINE для многострочного режима, re.DOTALL чтобы точка ловила перенос строки.
- Что такое регулярные выражения и зачем они нужны
2 Классы символов и кванторы
- Классы символов: [...], диапазоны и отрицание
Классы символов в квадратных скобках: перечисление, диапазоны вроде [a-z] и [0-9], отрицание [^...] и работа с кириллицей в регулярках.
- Готовые классы: \d, \w, \s и их заглавные версии
Сокращённые классы символов в регулярках: \d цифры, \w буквы и цифры, \s пробелы, и их инвертированные версии \D \W \S. Удобные шорткаты на каждый день.
- Кванторы: *, +, ?, {n,m}
Кванторы в регулярных выражениях: звёздочка * (ноль и более), плюс + (один и более), вопрос ? (ноль или один) и фигурные скобки {n,m} для точного количества.
- Жадность и лень, границы слов \b и якоря ^ $
Жадные и ленивые кванторы в регулярках, добавление ? для ленивого режима, граница слова \b и якоря начала ^ и конца $ строки.
- Классы символов: [...], диапазоны и отрицание
3 Группы и захват
- Группировка ( ) и захватывающие группы
Круглые скобки в регулярках: группировка для квантора и захват частей совпадения, доступ к группам через group(1), group(2) и метод groups().
- Именованные и незахватывающие группы
Именованные группы (?P<name>...) и доступ через group по имени и groupdict, а также незахватывающие группы (?:...) для группировки без захвата.
- Обратные ссылки и альтернация |
Обратные ссылки \1 и \2 для поиска повторов, оператор альтернации | для выбора между вариантами и правильная группировка альтернатив скобками.
- Группировка ( ) и захватывающие группы
4 Поиск и замена
- findall и finditer: все совпадения
Различие между re.findall и re.finditer: findall возвращает список строк или кортежей, finditer даёт объекты Match с позициями. Когда что использовать.
- Замена через sub: группы \1 и \g<name>
Функция re.sub для замены по регулярке: вставка захваченных групп в результат через \1 и \g<name>, переформатирование дат и нормализация текста.
- sub с функцией и split по регулярке
Замена через функцию в re.sub для сложной логики и разбиение строки на части с помощью re.split по шаблону-разделителю.
- Извлечение данных: email, телефоны, даты
Практическое извлечение email, телефонов и дат регулярками из текста — и честный разговор о пределах: где регулярки достаточно, а где формат слишком сложен.
- findall и finditer: все совпадения
5 Продвинутые приёмы
- Опережающие и ретроспективные проверки
Lookahead (?=...) и (?!...) и lookbehind (?<=...) и (?<!...) в регулярках: проверка контекста без его захвата, разделение тысяч и фильтрация по окружению.
- Проверка пароля по правилам
Собираем валидатор пароля на регулярках: несколько lookahead-проверок в одном паттерне для требований к длине, строчным, заглавным буквам и цифрам.
- Компиляция re.compile и производительность
Зачем компилировать регулярки через re.compile: переиспользование паттерна, методы скомпилированного объекта и влияние на производительность в циклах.
- Катастрофический бэктрекинг (ReDoS)
Что такое катастрофический бэктрекинг и атака ReDoS: почему вложенные кванторы вешают движок на специально подобранном вводе и как писать безопасные паттерны.
- Опережающие и ретроспективные проверки
6 Практика и кросс-язык
- Реальные кейсы: парсинг логов и очистка текста
Практические задачи на регулярках: разбор строки лога на IP, метод и код ответа, удаление HTML-тегов и нормализация текста с группами и заменой.
- Диалекты: Python vs JavaScript vs grep
Отличия регулярок в разных средах: именованные группы и lookbehind в Python и JavaScript, экранирование и базовый/расширенный синтаксис grep, ссылки на группы в замене.
- Инструменты и когда регулярки НЕ нужны
Инструменты для отладки регулярок (regex101 и аналоги) и важное правило: HTML, JSON и вложенные структуры парсят специализированными парсерами, а не регулярками.
- Шпаргалка по регулярным выражениям
Компактная шпаргалка по синтаксису регулярных выражений: метасимволы, классы, кванторы, группы, якоря, проверки и функции модуля re Python в одном месте.
- Реальные кейсы: парсинг логов и очистка текста