Программа принимает дату и должна убедиться, что это дата: строка из десяти символов, на третьем и шестом месте – точки, между ними цифры. Срезами и isdigit() из урока 8.2 такая проверка расписывается в десяток отдельных условий:
s = '03.09.2026'
ok = (len(s) == 10
and s[2] == '.' and s[5] == '.'
and s[:2].isdigit() and s[3:5].isdigit()
and s[6:].isdigit())
Работает – и остаётся хрупким: одна описка в индексе, и проверка пропускает мусор. А главное, для каждой новой формы записи (телефон, почтовый индекс, номер автомобиля) придётся писать такой же десяток заново, аккуратно считая позиции.
Есть язык, на котором форма записи описывается один раз и целиком:
import re
m = re.search(r'\d{2}\.\d{2}\.\d{4}', s)
Одна строка вместо десятка проверок – и она же найдёт дату внутри длинного текста, где позиции заранее неизвестны.
И честная оговорка на будущее: шаблон проверяет форму записи, а не смысл. Запись 45.13.2026 он пропустит: две цифры, точки на своих местах – форме всё соответствует, хотя ни сорок пятого дня, ни тринадцатого месяца не бывает. Шаблон, который знает календарь, составить можно, но это уже отдельная задача; здесь речь о форме.
В этом уроке: что такое регулярное выражение и зачем буква r перед шаблоном; метасимволы \d, \w, \s и их пары с большой буквы; классы символов в квадратных скобках; квантификаторы – «сколько раз повторить»; жадность и лень; якоря ^, $ и граница слова \b; экранирование; три функции поиска – search, match и fullmatch; и когда регулярное выражение не нужно вовсе.