Перейти до основного вмісту
Модуль 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, ricevuta #456'`, витягніть УСІ номери замовлень (цифри після #) у `orders` як список рядків. Оцініть «замовлення».

Завантаження редактора…
Показати підказку

re.findall(r"#(\\d+)", текст) — група захоплення лише цифр.

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m8.l4.e2
Спроби: 0Завантаження…

Якщо задано `s = 'tel: 06-12345678 e 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 спроб