Жадный (по умолчанию): .* — захватывает как можно больше
Ленивый: .*? — захватывает как можно меньше
Пример:
Строка: <b>bold</b> and <i>italic</i>
Жадный: <.*> → <b>bold</b> and <i>italic</i>
Ленивый: <.*?> → <b>, </b>, <i>, </i>
Классы символов
[abc] — a, b или c
[^abc] — НЕ a, b, c
[a-z] — от a до z
[A-Z] — от A до Z
[0-9] — от 0 до 9
[a-zA-Z0-9] — буквы и цифры
[а-яА-ЯёЁ] — русские буквы
Группы и обратные ссылки
Простые группы ()
(ab)+ — ab, abab, ababab
(\d{2})\.(\d{2})\.(\d{4}) — дата ДД.ММ.ГГГГ
(['"])(.*?)\1 — кавычки того же типа: "text" или 'text'
<(\w+)>.*?</\1> — открывающий и закрывающий тег: <div>...</div>
Незахватывающие группы (?:...)
(?:https?|ftp):// — группа без сохранения (для производительности)
Якоря
Якорь
Описание
Пример
^
Начало строки
^Hello — строка начинается с Hello
$
Конец строки
end$ — строка заканчивается на end
\b
Граница слова
\bword\b — целое слово
^test_.*\.py$ — файлы вида test_something.py
^\d{6}$ — ровно 6 цифр
\bERROR\b — слово ERROR целиком
Lookahead и Lookbehind («просмотр вперёд/назад»)
(?=...) — Positive lookahead: после идёт ...
(?!...) — Negative lookahead: после НЕ идёт ...
(?<=...) — Positive lookbehind: перед идёт ...
(?<!...) — Negative lookbehind: перед НЕ идёт ...
Примеры:
\d+(?=₽) — число перед рублём: "500₽" → "500"
\d+(?=\sрублей) — число перед "рублей"
(?<=\$)\d+(\.\d{2})? — число после $: "$49.99" → "49.99"
(?<!\d)\d{6}(?!\d) — ровно 6 цифр (не часть числа длиннее)
\b\w+(?=@example\.com)— имя пользователя до @example.com
Флаги / Модификаторы
Флаг
Описание
i
Регистронезависимый (Hello = hello)
g
Глобальный (все совпадения, не только первое)
m
Многострочный (^ и $ работают для каждой строки)
s
Dotall (. совпадает и с \n)
x
Расширенный (пробелы игнорируются, можно комментарии)
# Email (упрощённый)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
# Телефон РФ
^\+7\d{10}$
# UUID
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
# IPv4
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
# Дата ДД.ММ.ГГГГ
^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.(19|20)\d{2}$
# ИНН (10 или 12 цифр)
^\d{10}(\d{2})?$
Regex в разных языках
Python
import re
# Поиск
match = re.search(r'\d+', 'Цена: 500 рублей') # Первое
matches = re.findall(r'\d+', '500 и 300') # Все
for m in re.finditer(r'(\w+)=(\w+)', 'a=1 b=2'):
print(m.group(1), m.group(2))
# Замена
result = re.sub(r'\d+', 'X', 'Тест 123') # 'Тест X'
# Компиляция (для многократного использования)
pattern = re.compile(r'\d{2}\.\d{2}\.\d{4}')
if pattern.match('10.06.2024'):
print('Дата найдена')