Python: регулярные выражения
«Python: регулярные выражения» — тема, где важно не заучивание, а аккуратность. Показываем по шагам: определения, разбор типового задания, оформление ответа и критерии.
Зачем нужны регулярные выражения
Когда в задаче нужно проверить электронную почту, найти все даты в тексте или отделить числа от слов, обычных условий быстро становится слишком много. Регулярные выражения помогают описать шаблон одной строкой, а Python затем ищет, проверяет или заменяет подходящие фрагменты. В этой статье ты разберёшь основу без заучивания сложных комбинаций: научишься читать шаблон, применять его к строке и замечать типичные ошибки.
Регулярное выражение, или regex, — это набор символов с особым смыслом. Например, шаблон [0-9]+ означает «одна или несколько цифр». Он найдёт числа в строке, даже если рядом находятся слова или знаки препинания.
import re
text = "В классе 28 учеников"
result = re.search("[0-9]+", text)
print(result.group())
28
Модуль re входит в стандартную библиотеку Python, поэтому дополнительно устанавливать его не нужно. Если хочется потренироваться на коротких задачах, можно открыть бесплатную практику в личном кабинете и сразу проверить понимание шаблонов.
Из чего состоит шаблон
Начинать удобнее с обычных символов. Шаблон cat ищет именно последовательность «cat». Точка обозначает любой один символ, поэтому c.t подойдёт для «cat», «cut» и «c7t». Если нужно найти один символ из набора, используют квадратные скобки: [aeiou] означает любую гласную из перечисленных.
Диапазоны позволяют записывать набор короче: [a-z] — латинская буква в нижнем регистре, [A-Z] — в верхнем, [0-9] — цифра. Символ ^ внутри скобок отрицает набор: [^0-9] означает любой символ, который не является цифрой.
| Обозначение | Смысл | Пример |
|---|---|---|
. | любой символ | a.c |
[0-9] | одна цифра | [0-9] |
+ | один или больше раз | [0-9]+ |
* | ноль или больше раз | a* |
? | ноль или один раз | colou?r |
Квантификатор относится к символу или группе прямо перед ним. Поэтому ab+ ищет «a» и одну или несколько букв «b», а не повторяет всю последовательность «ab».
Поиск и проверка строки
Для поиска применяются разные функции модуля re. re.search() ищет первое совпадение в любом месте строки. re.findall() возвращает список всех совпадений. re.match() проверяет только начало строки, а re.fullmatch() требует, чтобы вся строка соответствовала шаблону.
import re
text = "Заказы: 12, 305 и 7"
numbers = re.findall("[0-9]+", text)
print(numbers)
['12', '305', '7']
Результаты поиска часто представлены объектом совпадения. У него можно вызвать group(), чтобы получить найденный текст, и start(), чтобы узнать позицию начала. Если совпадения нет, search() вернёт None. Поэтому перед вызовом group() полезно проверить результат условием.
Сначала сформулируй шаблон словами: «две цифры, дефис, четыре цифры». Только после этого записывай его в Python. Такой порядок снижает число случайных ошибок.
Если ты готовишься к ОГЭ или ЕГЭ и путаешь функции поиска, полезно решать задания по одному навыку. В разделе подготовки к ОГЭ можно закреплять алгоритм постепенно, не переходя сразу к самым длинным шаблонам.
Группы, границы и замена
Круглые скобки объединяют части шаблона в группу. Например, (ha)+ найдёт последовательности «ha», «haha» и «hahaha». Группа удобна, когда квантификатор должен относиться сразу к нескольким символам. Вертикальная черта означает выбор: cat|dog ищет «cat» или «dog».
Символ ^ в начале шаблона обозначает начало строки, а $ в конце — конец строки. С их помощью можно проверить, что строка содержит только нужный формат. Например, шаблон ^[0-9]+$ подходит для строки, состоящей только из цифр.
Функция re.sub() заменяет найденные фрагменты. Это удобно для очистки текста, удаления лишних пробелов или маскировки номеров. Параметр count ограничивает количество замен.
import re
text = "Телефон: 89991234567"
masked = re.sub("[0-9]", "*", text)
print(masked)
Телефон: ***********
Не забывай: найденные числа обычно возвращаются как строки. Если после поиска нужно вычислять сумму, преобразуй каждый элемент через int().
Разобранный пример и ошибки
Задача: проверить код ученика в формате двух заглавных латинских букв, дефиса и трёх цифр. Строка должна соответствовать формату полностью. Сначала описываем две буквы как [A-Z]{2}, затем дефис, затем три цифры [0-9]{3}. Границы задаём через ^ и $.
import re
code = "AB-307"
pattern = "^[A-Z]{2}-[0-9]{3}$"
if re.fullmatch(pattern, code):
print("Код верный")
else:
print("Код неверный")
Код верный
Разбор по шагам: [A-Z] выбирает одну заглавную букву; {2} требует ровно две такие буквы; дефис воспринимается буквально; [0-9]{3} требует ровно три цифры. Метод fullmatch() дополнительно подчёркивает, что лишних символов быть не должно.
Шаблон [0-9]{2,3} означает от двух до трёх цифр, а не «две или три цифры в конкретной позиции». Проверяй границы и не путай search() с полной проверкой строки.
Ещё одна частая ошибка — забыть, что findall() возвращает список строк. А при работе с точкой, скобками и другими специальными знаками нужно учитывать их особый смысл и при необходимости помещать знак в квадратные скобки.
Что запомнить
Регулярное выражение описывает форму текста. Квадратные скобки задают набор символов, фигурные скобки — точное количество повторений, а +, * и ? задают переменное количество. search() ищет фрагмент, findall() собирает все совпадения, sub() выполняет замену, а fullmatch() проверяет всю строку.
Рабочий алгоритм такой: сформулируй условие словами, собери маленькие части шаблона, объедини их, проверь несколько правильных и неправильных строк. Не пытайся сразу написать огромную конструкцию: короткий понятный шаблон легче проверить и исправить.
Следующий шаг — зарегистрируйся и реши 5 заданий бесплатно в личном кабинете. Так ты увидишь, какие элементы уже читаешь уверенно, а какие стоит повторить.
Если тема нужна для экзамена, сопоставляй регулярные выражения с общими навыками работы со строками и алгоритмами: это поможет не просто запомнить знаки, а выбрать правильный способ решения.
Что такое регулярное выражение?
Это шаблон, описывающий последовательность символов. Python использует его, чтобы находить, проверять или заменять фрагменты текста.
Чем отличаются search() и fullmatch()?
search() ищет совпадение в любом месте строки, а fullmatch() требует, чтобы вся строка целиком соответствовала шаблону.
Как закрепить тему после разбора?
Составь несколько собственных шаблонов для дат, кодов и чисел, проверь правильные и неправильные строки, а затем реши практические задания с постепенным усложнением.
Почему findall() возвращает строки?
Регулярное выражение работает с текстом, поэтому найденные фрагменты имеют строковый тип. Для вычислений их нужно преобразовать, например, через int().
Проверь себя на реальных заданиях
После такого разбора решите 5–7 заданий подряд — и тема ваша. Тренажёр Просто Урок подберёт их автоматически и объяснит ошибки по шагам. Бесплатно.