Справочник Python

Полное руководство по языку на русском

Регулярные выражения

Модуль re

import re  # импорт модуля регулярных выражений

text = "Мой email: user@example.com"  # строковое значение

# Поиск первого совпадения
match = re.search(r"\w+@\w+\.\w+", text)  # поиск первого совпадения
if match:  # условие
    print(match.group())  # user@example.com

# Все совпадения
emails = re.findall(r"\w+@\w+\.\w+", text)  # все совпадения

# Замена
result = re.sub(r"\d+", "NUMBER", "Цена: 100 рублей")  # замена по шаблону
# 'Цена: NUMBER рублей'

Специальные символы

СимволЗначение
.Любой символ, кроме новой строки
\dЦифра (0–9)
\wБуква, цифра, подчёркивание
\sПробельный символ
\DНе цифра
\WНе буква/цифра
\SНе пробельный
^Начало строки
$Конец строки
\bГраница слова

Квантификаторы

СимволЗначение
*0 и более
+1 и более
?0 или 1
{3}Ровно 3
{2,5}От 2 до 5
{2,}2 и более

Группы

text = "Иван: 30 лет"  # строковое значение
match = re.search(r"(\w+): (\d+)", text)  # сопоставление с образцом
if match:  # условие
    print(match.group(0))   # 'Иван: 30' (всё совпадение)
    print(match.group(1))   # 'Иван' (первая группа)
    print(match.group(2))   # '30' (вторая группа)
    print(match.groups())   # ('Иван', '30')

# Именованные группы
match = re.search(r"(?P\w+): (?P\d+)", text)  # сопоставление с образцом
print(match.group("name"))  # 'Иван'

Флаги

re.IGNORECASE / re.I  — регистронезависимый
re.MULTILINE  / re.M — ^ и $ работают по строкам
re.DOTALL     / re.S — точка включает \n
re.VERBOSE    / re.X — комментарии в паттерне

re.search(r"python", text, re.IGNORECASE)  # поиск первого совпадения

# VERBOSE — паттерн с комментариями
pattern = re.compile(r"""  # компиляция регулярного выражения
    \b
    \d{3}
    -\d{2}-
    \d{2}
    \b
""", re.VERBOSE)

Компиляция регулярных выражений

# Без компиляции (каждый раз компилируется заново)
for text in texts:  # цикл по элементам
    re.search(r"сложный\s+паттерн", text)  # поиск первого совпадения

# С компиляцией (быстрее в цикле)
pattern = re.compile(r"сложный\s+паттерн")  # компиляция регулярного выражения
for text in texts:  # цикл по элементам
    pattern.search(text)

Примеры

# Email
r"[\w.+-]+@[\w-]+\.[\w.]+"

# URL
r"https?://[\w./-]+"

# Телефон (Россия)
r"\+7\d{10}|8\d{10}"

# IP-адрес
r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

# Дата ДД.ММ.ГГГГ
r"\d{2}\.\d{2}\.\d{4}"

# HTML-тег
r"<[^>]+>"

# Все цифры в строке
re.findall(r"\d+", text)  # все совпадения

# Разделить строку по нескольким разделителям
re.split(r"[,\;\s]+", text)  # разделение по шаблону