Read the book: «Регулярные выражения на Python. 24 задачи с проверкой результата»

Font::

Начните с результата, а не с красивого шаблона

Регулярное выражение полезно, когда заранее понятно, какой текст нужно найти и какой нельзя принять. Если условие звучит как «вытащи правильные номера», сначала придётся договориться, что считается номером: сколько в нём знаков, какие буквы разрешены и где заканчивается одно значение. Без этого даже безошибочный синтаксис может давать неправильный для задачи результат.

В книге 24 небольшие самостоятельные работы. Каждая начинается с ограничения формата и заканчивается проверками. Набор проверок включает не только удачный пример: пустую строку, лишний символ, похожую последовательность или другой крайний случай. Это помогает отличать решение задачи от совпадения, которое случайно сработало на одной строке.

Нужны базовые знания Python: строки, списки, словари и вызов функции. Используются короткие выражения включения списков. В них запись [действие for элемент in набор] означает собрать результат действия для каждого элемента. Мы не предполагаем, что вы уже знаете синтаксис regex. Он объясняется по мере появления в заданиях.

Все данные синтетические. Программы ничего не читают с диска, не отправляют в интернет и не изменяют рабочие документы. Запускайте их сначала как отдельные учебные файлы. Не вставляйте персональные данные или реальные журналы в незнакомый онлайн-тестер только ради удобства проверки.

Как запускать и читать примеры

Примеры проверяются на Python 3.12. Нужен обычный интерпретатор из официального источника python.org. Сторонних пакетов нет: re, csv и io входят в стандартную библиотеку. Создайте в новой учебной папке файл task.py, скопируйте полный блок решения, сохраните как UTF-8 и запустите python3 task.py. В системах, где интерпретатор вызывается иначе, используйте настроенную команду Python 3. В терминале должен появиться результат, приведённый в книге.

Код в каждом решении самостоятельный. Не требуется сначала выполнять прошлые задачи или загружать архив автора. Не включайте в файл заголовок главы и блок ожидаемого вывода. В исходнике каждая строка кода начинается с левого края: в этих примерах нет вложенных блоков с обязательными отступами. Если читалка добавила перед строками пробелы, в том числе неразрывные, удалите только эти начальные отступы. Пробелы внутри строк и сами переносы строк сохраняйте. Длинная строка может переноситься читалкой визуально; это не повод вставлять в выражение дополнительный Enter.

Перед чтением решения попробуйте сформулировать ответ сами. В разделе дополнительных проверок для каждого случая отдельно замените только указанное исходное значение в полном блоке программы и запустите его заново. Шаблон и порядок действий должны оставаться прежними. Эти проверки независимы друг от друга: не накапливайте изменения входных переменных между ними.

Переменная text хранит исходную строку. В некоторых заданиях используется samples — список вариантов. Pattern обозначает шаблон, result — вычисленный ответ. Print(repr(result)) выводит представление ответа: символы новой строки становятся видимыми как \n, табуляции — как \t. Это позволяет сравнить не только слова, но и невидимые разделители. Кавычки вокруг напечатанной строки не обязательно являются её содержимым.

Большинство шаблонов записаны как raw-строки с буквой r перед кавычкой. Например, r'\b' передаёт модулю re обратную косую черту и букву b, а не служебный символ обычной Python-строки. Raw-строка не отменяет правила regex: она только помогает передать нужный текст шаблона через синтаксис Python.

Книга подготовлена с помощью ИИ. Полные блоки решений выполнены, а результаты сопоставлены с заранее заданными ответами и дополнительными случаями. Проверки не являются математическим доказательством правильности для любого ввода. У каждого шаблона остаются явные ограничения; версия интерпретатора и результаты локальной проверки фиксируются при сборке рукописи.

Три разных вопроса к строке

Fullmatch отвечает на вопрос, подходит ли вся строка целиком. Search ищет хотя бы одно совпадение где-то внутри. Findall возвращает найденные фрагменты, но форма результата зависит от захватывающих групп. Подмена одного вопроса другим — частый источник ошибок даже при хорошем шаблоне.

Для проверки одного идентификатора обычно нужен fullmatch. Для поиска кодов в письме — извлечение нескольких совпадений. Для изменения пробелов — sub. Выбор операции делается по условию задачи, а не по тому, какая функция первой встретилась в примере из интернета.

Ни одна из этих операций не доказывает истинность сведений. Формально корректный код может отсутствовать в базе, строка похожей даты — обозначать невозможный день, а имя — принадлежать кому угодно. Regex отвечает за описанный текстовый формат, а не за бизнес-смысл и права доступа.

Задача 1. Проверить код документа целиком

Формат учебного кода: две заглавные латинские буквы, дефис и ровно четыре ASCII-цифры. Пробелы, строчные буквы и посторонние символы запрещены. Верните True или False для каждого элемента samples; не вырезайте подходящую часть из неподходящего значения.

Решение

import re

samples = ['AB-0042', 'ab-0042', 'AB-0042x', '', 'AB-123']

pattern = r'[A-Z]{2}-[0-9]{4}'

result = [re.fullmatch(pattern, s) is not None for s in samples]

print(repr(result))

Ожидаемый результат

[True, False, False, False, False]

Квадратные скобки задают допустимые символы, фигурные — число повторов. [A-Z]{2} означает два символа из указанного латинского диапазона, а не две произвольные буквы любого языка. Дефис вне класса здесь обозначает обычный дефис.

Мы используем fullmatch, потому что проверяем значение целиком. Search мог бы найти AB-0042 внутри более длинной строки и тем самым ответить не на заданный вопрос. Нормализация пробелов не выполняется: по условию они запрещены, поэтому молча исправлять вход нельзя.

Дополнительные проверки

samples = ['ZZ-9999', ' AA-0001', 'AA-0001\n']

Должно получиться:

[True, False, False]

Вопрос

Нужно ли добавить ^ и $ к этому шаблону для fullmatch?

Ответ

Нет, сама операция требует совпадения со всей строкой. Явные дополнительные якоря здесь не дают нужного нового ограничения.

The free sample has ended.

Genres and tags

Age restriction:
12+
Release date on Litres:
06 September 2026
Writing date:
2026
Volume:
26 p. 1 illustration
Copyright Holder::
Автор
Download format:

Similar books