
Регулярные выражения в Python реализуются через модуль re, который позволяет искать, заменять и проверять текстовые шаблоны. Основная функция re.compile() создаёт объект шаблона, что ускоряет многократное использование выражения в больших проектах.
Для поиска совпадений используют методы match(), search() и findall(). match() проверяет соответствие только в начале строки, search() возвращает первое совпадение в любом месте, а findall() собирает все совпадения в список.
Синтаксис регулярных выражений включает конкретные символы, метасимволы и квантификаторы. Символы ., \d, \w и \s соответствуют любому символу, цифре, букве или пробельному символу. Квантификаторы *, +, ? и {n,m} задают количество повторов, а скобки () формируют группы для извлечения подстрок.
Для корректного написания выражений рекомендуется использовать raw-строки (r»шаблон»), чтобы Python не интерпретировал обратные слэши. Это критично при работе с путями файлов, датами и сложными шаблонами, содержащими множество экранированных символов.
Практика показывает, что сложные шаблоны проще тестировать пошагово: сначала проверяют отдельные символы и группы, затем объединяют их в единое выражение. Использование re.VERBOSE помогает структурировать длинные шаблоны с комментариями, делая их более читаемыми и поддерживаемыми.
Установка и подключение модуля re
Модуль re встроен в стандартную библиотеку Python, поэтому отдельная установка не требуется. Он доступен сразу после установки интерпретатора Python версии 3.x.
Для подключения модуля используется ключевое слово import:
import re
После подключения доступны основные функции и методы для работы с регулярными выражениями:
re.match()– проверяет соответствие строки шаблону с начала строки.re.search()– ищет первое совпадение шаблона в строке.re.findall()– возвращает список всех совпадений шаблона.re.sub()– заменяет найденные совпадения шаблона на указанное значение.re.compile()– создаёт объект регулярного выражения для повторного использования.
Рекомендуется использовать re.compile() при многократном применении одного и того же шаблона для повышения производительности:
pattern = re.compile(r'\d{3}-\d{2}-\d{4}')
result = pattern.findall('123-45-6789, 987-65-4321')
print(result) # ['123-45-6789', '987-65-4321']
Для отладки и тестирования регулярных выражений полезно подключать флаг re.DEBUG:
re.compile(r'\d{3}-\d{2}-\d{4}', re.DEBUG)
Все эти шаги обеспечивают корректное подключение и использование модуля re без необходимости внешней установки или дополнительных библиотек.
Создание простых шаблонов для поиска текста

В Python модуль re предоставляет функции для работы с регулярными выражениями. Самый базовый способ поиска текста – использовать функцию re.search(pattern, string), которая возвращает первый совпадающий объект или None.
Для поиска фиксированного слова применяют простую строку в качестве шаблона. Например, re.search('Python', 'Изучаю Python') найдет вхождение слова «Python». Символы учитываются строго, без подстановок.
Для поиска нескольких вариантов слов используют оператор |. Пример: re.search('cat|dog', 'Моя собака – dog') вернет совпадение с «dog». Это позволяет объединять несколько альтернатив в один шаблон.
Чтобы учитывать повторяющиеся символы, применяются квантификаторы: * (0 и более раз), + (1 и более), ? (0 или 1 раз). Например, шаблон ab+ найдет «ab», «abb», «abbb» и т.д.
Для обозначения диапазона символов используют квадратные скобки. [a-z] найдет любую строчную латинскую букву, [0-9] – любую цифру. Можно комбинировать диапазоны: [a-zA-Z0-9].
Если нужно искать конкретное количество повторений, используют фигурные скобки: a{3} найдет ровно три буквы «a», \d{2,4} – от двух до четырех цифр подряд.
Для быстрого поиска начала или конца строки применяются якоря: ^ соответствует началу строки, $ – концу. Например, ^Hello найдет «Hello» только в начале строки.
Для удобства чтения и избежания экранирования специальных символов используют сырые строки: r'\d+'. Это особенно важно при поиске обратных слешей и специальных символов.
Простейший алгоритм создания шаблона: определить цель поиска → выделить ключевые символы → выбрать подходящие квантификаторы и диапазоны → проверить через re.search или re.findall. Такой подход обеспечивает точное и предсказуемое сопоставление с текстом.
Использование метасимволов для сложных совпадений

Метасимволы в Python позволяют создавать точные шаблоны для поиска строк, которые невозможно описать обычными символами. Основные метасимволы включают точку . для любого символа, символы начала ^ и конца строки $, а также группы () и альтернативы |.
Пример: регулярное выражение ^A.*z$ совпадает со строками, начинающимися с ‘A’ и заканчивающимися на ‘z’, независимо от длины промежуточного текста.
Квантификаторы *, +, ? и {m,n} задают количество повторений символов или групп. Например, \d{2,4} найдет от двух до четырех цифр подряд, а \w+@\w+\.\w{2,3} применяют для базовой проверки e-mail.
Метасимволы классов символов [] и отрицания [^] позволяют задать набор допустимых или запрещенных символов. Выражение [A-Fa-f0-9]{6} эффективно для поиска шестнадцатеричных кодов цветов.
С помощью обратных ссылок \1, \2 можно проверять повторение захваченных групп. Пример: (\w)\1 найдет два одинаковых символа подряд.
Метасимволы \b и \B обозначают границы слов и их отсутствие, что позволяет точечно искать слова или части слов, например \bcat\b совпадет с ‘cat’, но не с ‘catalog’.
Для сложных совпадений рекомендуется комбинировать группы, квантификаторы и классы символов, избегая чрезмерного использования универсального .*, чтобы уменьшить риск чрезмерных или ложных совпадений.
Использование метасимволов в сочетании с функциями re.match(), re.search() и re.findall() позволяет создавать гибкие и точные фильтры данных, экономя время и снижая вероятность ошибок при обработке текстовых данных.
Применение групп и захват подстрок
Группы в регулярных выражениях позволяют объединять символы для совместного применения квантификаторов и извлечения подстрок. В Python группы обозначаются круглыми скобками (…). Каждая группа получает индекс, начиная с 1, а вся регулярка – индекс 0.
Пример: извлечение даты формата ДД-ММ-ГГГГ:
import re
text = "Сегодня 15-09-2025"
pattern = r"(\d{2})-(\d{2})-(\d{4})"
match = re.search(pattern, text)
if match:
day, month, year = match.groups()
В данном случае match.groups() возвращает кортеж ('15', '09', '2025'). Первая группа захватывает день, вторая – месяц, третья – год.
Именованные группы повышают читаемость и удобство обращения к подстрокам. Синтаксис: (?P<имя>…).
pattern = r"(?P\d{2})-(?P\d{2})-(?P\d{4})"
match = re.search(pattern, text)
if match:
day = match.group('day')
month = match.group('month')
year = match.group('year')
Применение нескольких групп удобно для парсинга повторяющихся структур. Например, список товаров с ценами:
text = "Яблоко: 50, Банан: 30, Вишня: 70"
pattern = r"(\w+): (\d+)"
matches = re.findall(pattern, text)
matches вернет [('Яблоко', '50'), ('Банан', '30'), ('Вишня', '70')], что позволяет сразу использовать данные для дальнейших вычислений.
Для анализа нескольких вариантов можно применять группы с оператором |. Пример извлечения расширений файлов:
text = "file1.txt, file2.pdf, image.png"
pattern = r"(\w+)\.(txt|pdf|png)"
matches = re.findall(pattern, text)
Результат: [('file1', 'txt'), ('file2', 'pdf'), ('image', 'png')]. Первая группа захватывает имя файла, вторая – расширение.
| Метод | Назначение |
|---|---|
| re.search() | Ищет первое совпадение и возвращает объект Match |
| re.match() | Проверяет совпадение с начала строки |
| re.findall() | Возвращает список всех совпадений с учетом групп |
| match.groups() | Возвращает кортеж всех захваченных групп |
| match.group(‘имя’) | Возвращает содержимое именованной группы |
Использование групп и захвата подстрок оптимизирует обработку текстов, упрощает разбор сложных структур и позволяет строить динамические паттерны для извлечения информации.
Поиск и замена текста с помощью re.sub

Функция re.sub позволяет заменить все совпадения регулярного выражения в строке на заданный текст. Синтаксис: re.sub(pattern, repl, string, count=0, flags=0). Параметр count ограничивает количество замен, flags управляет режимами поиска, например re.IGNORECASE для нечувствительности к регистру.
Пример: чтобы заменить все цифры в строке на символ «#», используется выражение re.sub(r"\d", "#", "Телефон: 123-456"), результат: "Телефон: ###-###".
Можно использовать функции в качестве второго аргумента. Например, re.sub(r"\b\w+\b", lambda m: m.group(0).upper(), "hello world") преобразует все слова в верхний регистр: "HELLO WORLD". Это полезно для динамических замен, зависящих от контекста совпадения.
Для сложных шаблонов рекомендуется применять именованные группы: re.sub(r"(?P выдаст "a:1 b:2". Именованные группы повышают читаемость и упрощают модификацию замены.
При работе с большими текстами полезно использовать флаг re.MULTILINE для обработки текста построчно, например: re.sub(r"^#", "//", multiline_text, flags=re.MULTILINE) заменяет символ «#» в начале каждой строки на «//».
Рекомендация: всегда тестируйте регулярное выражение на небольших фрагментах, особенно при использовании re.sub с функциями, чтобы убедиться, что замены соответствуют ожиданиям и не удаляют важные данные.
Тестирование и отладка регулярных выражений

Тестирование регулярных выражений в Python требует системного подхода: проверка корректности синтаксиса, соответствия целевым строкам и обработки крайних случаев.
Основные шаги отладки:
- Использование модуля
re: функцииre.match(),re.search(),re.findall()иre.finditer()позволяют пошагово проверять поведение шаблона на конкретных строках. - Просмотр совпадений: метод
group()и атрибутыstart(),end()помогают определить точные позиции найденных фрагментов. - Тестирование с различными входными данными: проверяйте шаблон на строках с пробелами, спецсимволами, пустыми значениями и неожиданными форматами.
- Разделение шаблонов: для сложных выражений разбивайте их на части и проверяйте каждую отдельно, затем объединяйте с помощью групп и альтернатив.
- Онлайн-инструменты: сервисы вроде regex101.com позволяют визуализировать группы, тестировать выражения и получать пошаговое объяснение.
- Логирование совпадений: сохраняйте результаты
findall()илиfinditer()в список и анализируйте их, чтобы убедиться, что шаблон не пропускает нужные фрагменты. - Использование флагов:
re.IGNORECASE,re.MULTILINE,re.DOTALLизменяют поведение сопоставления и помогают тестировать выражение в разных контекстах.
Рекомендации по отладке:
- Сначала проверяйте простые шаблоны на небольших строках.
- Добавляйте группы и квантификаторы постепенно, фиксируя ошибки на каждом шаге.
- Используйте тестовые наборы строк, включающие корректные и некорректные примеры, чтобы убедиться в точности выражения.
- Документируйте каждый шаблон и его назначение, чтобы ускорить будущие модификации и устранение ошибок.
- Избегайте чрезмерно сложных регулярных выражений: при необходимости делите проверку на несколько шагов с понятными шаблонами.
Вопрос-ответ:
Что такое регулярное выражение в Python и где оно используется?
Регулярное выражение — это строка с определённым шаблоном, который позволяет искать, проверять и изменять текст. В Python для работы с ними применяется модуль `re`. С его помощью можно искать совпадения в строках, заменять части текста, разбивать строки по сложным правилам. Например, можно проверить, соответствует ли email стандартному формату, или извлечь все числа из текста.
Как правильно использовать символы «.», «*» и «+» в шаблонах?
Символ «.» соответствует любому одиночному символу, кроме перевода строки. «*» означает, что предыдущий символ или группа может встречаться ноль или более раз, а «+» — один или более раз. Например, шаблон `a.*b` найдёт любую последовательность, начинающуюся с «a» и заканчивающуюся «b», включая всё между ними. Важно учитывать, что «.*» работает жадно и может захватывать больше текста, чем ожидается, поэтому для точного контроля иногда используют «.*?».
Как проверить, соответствует ли строка определённому шаблону?
В Python для этого используют функцию `re.fullmatch` или `re.match`. `re.fullmatch` проверяет, соответствует ли вся строка шаблону целиком, а `re.match` — совпадение только в начале строки. Например, чтобы проверить, что строка состоит только из цифр, можно написать `re.fullmatch(r»\d+», s)`. Если функция возвращает объект, значит совпадение найдено; если `None`, значит строка не подходит под шаблон.
Как извлечь все совпадения по шаблону в тексте?
Для этого применяется функция `re.findall`, которая возвращает список всех найденных совпадений. Например, чтобы получить все email-адреса из текста, можно использовать шаблон `r»[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}»`. Если текст содержит несколько совпадений, они будут перечислены в списке в том порядке, в котором встречаются. Также можно использовать `re.finditer`, чтобы получать совпадения как объекты с дополнительной информацией о позиции в строке.
