Перейти к основному содержимому
Модуль 8 · Урок 4 из 432/36 в курсе~12 min
Уроки модуля (4/4)

модуль re: регулярное выражение в Python

Модуль re предоставляет регулярные выражения в Python. Если вы уже взяли курс Regex на этом сайте, вы найдете весь синтаксис знакомым; здесь мы смотрим на API.

Необработанная строка: r"..."

Регулярные выражения используют множество обратных косых черт (\d, \b, \s). Всегда записывайте их как сырые строки, поэтому вам не придется их удваивать:

Python
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"

re.search: найти первое вхождение

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Возвращает объект Match, если он найден, и None в противном случае. Идиоматический образец:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: только в начале строки

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (doesn't start with a digit)

Для поиска в любом месте выберите re.search.

re.findall: все вхождения

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

Если в шаблоне есть группы захвата, findall возвращает группы, а не весь матч:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: замена

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

Он также работает с функцией замены (которая получает совпадение):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

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

Python
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno")    # '2025'
m.groupdict()      # {'anno': '2025', 'mese': '01', 'giorno': '15'}

Полезные флаги

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL)            # . matches newline too

re.finditer для безопасности памяти

Если вам нужно обработать совпадения в огромном текстовом блоке, re.findall выделяет в памяти список, содержащий все извлеченные строки совпадений. Предпочтительно использовать re.finditer(), который создает ленивый итератор объектов Match, потребляющий минимум памяти.

Попробуйте это

Упражнение#python.m8.l4.e1
Попыток: 0Загрузка…

Учитывая `text = 'ordine #123, totale €45,50, richvuta #456'`, извлеките ВСЕ номера заказов (цифры после #) в `orders` в виде списка строк. Оцените «заказы».

Загрузка редактора…
Показать подсказку

re.findall(r"#(\\d+)", text) — группа захвата только для цифр.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m8.l4.e2
Попыток: 0Загрузка…

Учитывая `s = 'tel: 06-12345678 и tel: 02-9876'`, замените все телефонные номера (формат \\d+-\\d+) строкой "XXX" и присвойте `masked`. Оцените «в маске».

Загрузка редактора…
Показать подсказку

re.sub(r"\\d+-\\d+", "XXX", s)

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#python.m8.l4.e3
Попыток: 0Загрузка…

Импортируйте модуль «re». Извлеките все числа, состоящие из одной или нескольких цифр, из строки \`log_line = "Ошибка 404 за 15 мс"\`. Сохраните список в числах и оцените его.

Загрузка редактора…
Показать подсказку

Используйте re.findall(r'\\d+', log_line), чтобы извлечь все числа в виде списка строк.

Решение доступно после 3 попыток