Регулярные выражения в Python: практика поиска, замены и групп

Этот материал нужен не для запоминания всех символов regex, а для трех практических действий: найти фрагмент, заменить лишнее и достать нужную группу из строки

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Поиск первого совпадения

import re

text = "Заказ 125 оформлен"
match = re.search(r"\d+", text)

if match:
    print(match.group())

search возвращает объект совпадения или None. Поэтому перед group() нужна проверка

Поиск всех совпадений

import re

text = "Заказы 125, 340 и 77"
numbers = re.findall(r"\d+", text)

print(numbers)

Если нужны числа, преобразуйте строки

numbers = [int(number) for number in numbers]
print(sum(numbers))

Замена

import re

text = "много     пробелов"
clean = re.sub(r"\s+", " ", text).strip()

print(clean)

sub возвращает новую строку. Исходная строка не меняется

Группы

import re

text = "order=125; email=anna@example.com"

order = re.search(r"order=(\d+)", text)
email = re.search(r"email=([\w.-]+@[\w.-]+)", text)

print(order.group(1) if order else "заказ не найден")
print(email.group(1) if email else "email не найден")

Скобки в шаблоне обозначают часть, которую нужно достать отдельно

Именованные группы

import re

text = "2026-07-03"
match = re.search(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})", text)

if match:
    print(match.group("year"))
    print(match.group("month"))
    print(match.group("day"))

Именованные группы удобны, когда частей несколько и номера становятся неочевидными

Флаги

import re

text = "Python\npython\nPYTHON"
matches = re.findall(r"python", text, flags=re.IGNORECASE)

print(matches)
ФлагЧто делает
re.IGNORECASEне учитывать регистр
re.MULTILINE^ и $ работают по строкам
re.DOTALLточка захватывает перевод строки

Отладка шаблона

Проверяйте шаблон на трех строках: правильной, пустой и неправильной

import re

samples = ["order=125", "", "order=abc"]
pattern = r"order=(\d+)"

for sample in samples:
    match = re.search(pattern, sample)
    print(sample, "=>", match.group(1) if match else "нет")

Когда regex не нужен

Если задача простая, обычные методы строк читаются лучше

text = "python,sql,html"
items = text.split(",")

print(items)

Используйте регулярные выражения там, где нужен шаблон: цифры разной длины, формат даты, email, телефон, группы внутри строки

Разбор шаблона по частям

Регулярное выражение легче понимать, если проговаривать каждый фрагмент. Возьмем строку заказа и достанем номер, город и сумму

import re

text = "order=104 city=Kazan amount=1490"
pattern = r"order=(?P<order>\d+)\s+city=(?P<city>[A-Za-z]+)\s+amount=(?P<amount>\d+)"

match = re.fullmatch(pattern, text)

if match:
    data = match.groupdict()
    data["amount"] = int(data["amount"])
    print(data)
ФрагментЗначение
order=обычный текст
(?P<order>\d+)группа с номером заказа
\s+один или несколько пробелов
[A-Za-z]+английские буквы
amount=(?P<amount>\d+)сумма отдельной группой

Практика замены

re.sub() полезен, когда нужно не просто найти, а привести текст к единому виду

import re

phone = "+7 (999) 123-45-67"
digits = re.sub(r"\D+", "", phone)

print(digits)

После очистки можно проверить длину или формат

if len(digits) == 11 and digits.startswith("7"):
    print("номер похож на российский")
else:
    print("нужно проверить вручную")

Поиск нескольких совпадений с позициями

finditer удобен, когда важен не только текст совпадения, но и место в строке

import re

text = "Python 3.12, Django 5, Pandas 2"

for match in re.finditer(r"\d+(?:\.\d+)?", text):
    print(match.group(), match.start(), match.end())

Так можно подсветить совпадения, вырезать фрагменты или понять, почему шаблон нашел не то место

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x