Регулярные выражения в Python: модуль re простыми словами с примерами
Если вы искали понятное руководство по запросу «регулярные выражения в Python re примеры» — вы по адресу. Ниже собраны базовые концепции, практические шаблоны и советы, которые помогут уверенно пользоваться модулем re уже сегодня.
Что такое регулярные выражения и когда их применять
Регулярные выражения — это язык шаблонов для поиска и преобразования текста. Они незаменимы, когда нужно:
- находить и извлекать части строк (номера, даты, email-адреса);
- заменять фрагменты по сложным правилам;
- проверять формат ввода (валидация).
Важно: для парсинга сложных форматов (например, HTML) лучше использовать специализированные парсеры. Регулярки — для гибких текстовых шаблонов.
Быстрый старт с модулем re
Подключение и базовые функции:
import re
text = "Python 3.12 выпущен!"
# search: найти первое совпадение где угодно в строке
m = re.search(r"Python (\d+\.\d+)", text)
if m:
print(m.group(1)) # 3.12
# match: начать поиск строго с начала строки
print(re.match(r"Python", text) is not None) # True
# findall: вернуть все совпадения списком строк/кортежей
print(re.findall(r"\d+", text)) # ['3', '12']
# sub: замена по шаблону
print(re.sub(r"\d+", "X", text)) # Python X.X выпущен!
# split: разбиение по регулярному выражению
print(re.split(r"\s+", text)) # ['Python', '3.12', 'выпущен!']
В шаблонах используйте «сырые» строки r"...", чтобы не экранировать обратные слеши Python-строкой.
Основные элементы шаблонов re
- Символьные классы: \d (цифра), \w (буква/цифра/"_"), \s (пробел), их отрицания: \D, \W, \S.
- Якоря: ^ — начало строки, $ — конец строки, \b — граница слова.
- Квантификаторы: * (0+), + (1+), ? (0 или 1), {m,n} — диапазон повторений.
- Группы: ( ... ) — группировка и захват; (?: ... ) — без захвата; (?P<name> ... ) — именованные группы.
- Альтернация: A|B — «или».
- Жадность и ленивость: по умолчанию квантификаторы жадные; добавьте ? для ленивых версий: *?, +?, {m,n}?
import re
s = "Email: test.user@mail.com и test2@mail.ru"
# Группы и именованные группы
pat = r"(?P<name>[\w.]+)@(?P<domain>[\w.]+)"
for m in re.finditer(pat, s):
print(m.group("name"), m.group("domain"))
# test.user mail.com
# test2 mail.ru
# Жадность vs ленивость
html = "<div>one</div><div>two</div>"
print(re.findall(r"<div>.*</div>", html)) # жадно: один большой матч
print(re.findall(r"<div>.*?</div>", html)) # лениво: два отдельных
Полезные рецепты (copy-paste)
1) Извлечь все числа (целые и десятичные, с минусом)
import re
s = "Температуры: -3, 0, 12.5 и -7.25 градуса"
nums = re.findall(r"-?\d+(?:\.\d+)?", s)
print(nums) # ['-3', '0', '12.5', '-7.25']
2) Простая валидация email
Подойдёт для базовой проверки, не для RFC-полной валидации.
import re
emails = ["test@mail.com", "bad@@mail", "x@y.z"]
pat = re.compile(r"^[\w.+-]+@[\w-]+\.[A-Za-z]{2,}$")
for e in emails:
print(e, bool(pat.match(e)))
# test@mail.com True, bad@@mail False, x@y.z False
3) Разбить по нескольким разделителям (запятая, точка с запятой, пробелы)
import re
s = "one, two;three four"
parts = [p for p in re.split(r"[;,\s]+", s) if p]
print(parts) # ['one', 'two', 'three', 'four']
4) Сжать подряд идущие пробелы до одного
import re
s = " Hello world ! "
print(re.sub(r"\s+", " ", s).strip()) # Hello world !
5) Парсинг лога с именованными группами
import re
line = '127.0.0.1 - - [10/Feb/2026:10:24:42 +0000] "GET /index.html HTTP/1.1" 200 512'
pat = re.compile(
r"^(?P<ip>\S+)\s+\S+\s+\S+\s+\[(?P<ts>[^\]]+)\]\s+\"(?P<method>\S+)\s+(?P<path>\S+)\s+HTTP/(?P<httpver>\d+\.\d+)\"\s+(?P<code>\d+)\s+(?P<size>\d+)"
)
m = pat.search(line)
print(m.groupdict())
# {'ip': '127.0.0.1', 'ts': '10/Feb/2026:10:24:42 +0000', 'method': 'GET', 'path': '/index.html', 'httpver': '1.1', 'code': '200', 'size': '512'}
6) Все слова, начинающиеся на «py», без учёта регистра
import re
text = "Python и pytest полезны, а pYramid — веб-фреймворк"
print(re.findall(r"\bpy\w*", text, flags=re.IGNORECASE))
# ['Python', 'pytest', 'pYramid']
Флаги re, которые стоит знать
- re.IGNORECASE (re.I): игнорировать регистр букв.
- re.MULTILINE (re.M): якоря ^ и $ работают для каждой строки отдельно.
- re.DOTALL (re.S): точка "." матчится и с переводом строки.
- re.VERBOSE (re.X): писать шаблоны с пробелами и комментариями для читаемости.
import re
text = "Foo\nbar\nBaz"
print(re.findall(r"^b\w+", text, flags=re.I | re.M)) # ['bar', 'Baz']
pat = re.compile(r"""
^ # начало строки
(\+7|8)\s? # код страны
\(?\d{3}\)?\s? # код города
\d{3}-?\d{2}-?\d{2}$ # номер
""", flags=re.X)
print(bool(pat.match("+7 (495) 123-45-67"))) # True
Компиляция шаблонов: когда это нужно
Если одно и то же выражение используется много раз, выгодно скомпилировать его один раз.
import re
pat = re.compile(r"\b\w{3,}\b")
texts = ["short", "some long text", "another line"]
for t in texts:
print(pat.findall(t))
Советы и лучшие практики
- Используйте r"..." для паттернов, чтобы не запутаться с экранированием.
- Старайтесь якорить шаблоны ^...$, когда валидируете полную строку.
- Для читаемости длинных паттернов применяйте re.VERBOSE и комментарии.
- Проверяйте шаблоны на тестовых строках. Онлайн-песочницы (например, regex101) помогают быстрее отладить идею; учитывайте режим «Python».
- Не злоупотребляйте «жадными» квантификаторами. Если нужно минимальное покрытие — используйте ленивые версии *?, +?, {m,n}?.
Хотите системно прокачать Python и закрепить практикой десятки подобных приёмов? Загляните в Пошаговый курс «Python с Нуля до Гуру» — там по полочкам разложены основы, задания и реальные мини‑проекты.
Короткая шпаргалка по re
# Функции
re.search(p, s) # первое совпадение
re.match(p, s) # с начала строки
re.findall(p, s) # список совпадений
re.finditer(p, s) # итератор совпадений
re.sub(p, rep, s) # замена
re.split(p, s) # разбиение
re.compile(p, flags=0) # компиляция
# Частые классы/якоря/квантификаторы
\d \w \s ^ $ \b * + ? {m,n} | ( ) (?: ) (?P<name> )
Итог
Регулярные выражения в Python — это компактный и очень мощный инструмент для повседневной работы с текстом. Освойте базовые классы символов, группы, квантификаторы и флаги — и вы сможете быстро решать задачи извлечения данных, валидации и замены в пару строк кода.
-
Создано 11.02.2026 17:01:40
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.