Этот материал нужен не для запоминания всех символов 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())
Так можно подсветить совпадения, вырезать фрагменты или понять, почему шаблон нашел не то место