Регулярные выражения (regex) — мощный инструмент для поиска и обработки текста. Они выглядят загадочно, но после изучения базового синтаксиса вы будете решать задачи, которые раньше требовали десятков строк кода.
Основы синтаксиса
# regex_basics.py
import re # Метасимволы: # . — любой символ кроме # * — 0 или более предыдущего # + — 1 или более предыдущего # ? — 0 или 1 (необязательный) # ^ — начало строки # $ — конец строки # \d — цифра [0-9] # \w — буква, цифра, _ # \s — пробельный символ text = "Python 3.11 вышел в 2022 году" numbers = re.findall(r'\d+', text) # ['3', '11', '2022']
Основные функции модуля re
# re_functions.py
import re email = "user@example.com" pattern = rr'[\w.+-]+@[\w-]+\.[a-z]{2,}' # match — только с начала строки # search — первое вхождение в любом месте m = re.search(pattern, "Пиши на user@example.com") if m: print(m.group()) # user@example.com # findall — все вхождения (список строк) # finditer — все вхождения (итератор Match)![]()
# sub — замена result = re.sub(r'\d', '*', "tel: 79991234567") # "tel: ***********"
// Raw strings r'' в regex
Всегда используйте r'' (raw string) для паттернов. Без r: '\d' (два символа — обратный слеш + d). С r: r'\d' (один символ — буква d с особым значением в regex). Это избегает двойного экранирования и делает паттерны читаемыми.
Группы захвата
# groups.py
import re date = "2024-03-15" # Обычные группы (нумерованные) m = re.match(rr'(\d{4})-(\d{2})-(\d{2})', date) year, month, day = m.groups() # Именованные группы — лучше для читаемости m = re.match( rr'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', date ) print(m.group('year')) # 2024
Lookahead и Lookbehind
# lookahead.py
# (?=...) positive lookahead — за совпадением следует prices = "100 USD, 200 EUR, 300 RUB" usd_amounts = re.findall(rr'\d+(?= USD)', prices) # ['100'] # (?<=...) positive lookbehind — перед совпадением стоит after_dollar = re.findall(rr'(?<=\$)\d+', "цена: $42") # ['42']