Шпаргалка по regex

Публичный

Автор:

Файл: regex.md Язык: Markdown

📌 Шпаргалка по Регулярным Выражениям (Regex)

Регулярные выражения — это мощный инструмент для поиска, замены и валидации шаблонов в тексте.


1. Введение и Основы 💡

Элемент Описание Пример (Python)
Синтаксис Шаблон заключается в слеши (в Python обычно используется префикс r для "сырых" строк: r"шаблон"). r"слово"
Флаги Изменяют поведение поиска. В Python передаются как аргумент: re.search(pattern, text, flags=re.I). re.I (Ignore case), re.M (Multiline). В Python нет флага re.G — он реализован через re.findall() или re.finditer().
Экранирование Используется для поиска специальных символов как литералов (., *, ?, +, ( и т.д.). \. (точка), \( (открывающая скобка).

2. Якоря и Границы ⚓

Якоря соответствуют позиции, а не самому символу.

Якорь Описание Пример
^ Начало строки (или линии при флаге m). ^Начало
$ Конец строки (или линии при флаге m). Конец$
\b Граница слова (переход между \w и \W). \bкот\b — найдёт "кот", но не "котлета".
\B Не граница слова (внутри слова). \Bот\B — найдёт "работ", но не "от".

3. Символьные Классы и Метасимволы 📝

Соответствуют одному символу из набора.

Синтаксис Название Соответствует
. Точка Любой символ (кроме \n, если не стоит флаг s).
[abc] Пользовательский набор a, b или c.
[0-9] Диапазон Цифра от 0 до 9.
[^0-9] Исключение Любому символу, кроме цифры.
\d / \D Цифра / Не цифра [0-9] / [^0-9]
\w / \W Символ слова / Не символ слова [a-zA-Z0-9_] / [^a-zA-Z0-9_]
\s / \S Пробел / Не пробел Пробел, табуляция, перевод строки.

4. Квантификаторы (Повторение) 🔢

Определяют, сколько раз должен повториться предыдущий элемент.

Квантификатор Описание Пример
* Ноль или более (0+). a*
+ Одно или более (1+). a+
? Ноль или одно (опционально). a?
{n} Ровно n повторений. \d{4}
{n,} n или более. \d{3,}
{n,m} От n до m повторений. \w{5,8}

Жадность vs. Ленивость 🐌

  • Жадный (по умолчанию): захватывает максимально возможную строку.

  • Ленивый: добавьте ? после квантификатора — *?, +?, {n,m}?.

  • Пример: .*? — ноль или более любых символов (лениво).


5. Группировка, Логика и Ссылки 📦

Синтаксис Название Назначение
( ) Захватывающая группа Группирует и сохраняет для обратных ссылок (\1, \2).
| ИЛИ (логическое) кошка|собака — найдёт "кошка" или "собака".
(?: ) Незахватывающая группа Группирует без сохранения (оптимизация).
\n Обратная ссылка Ссылка на содержимое n-й группы.
Пример (\w+)\s+\1 Найдёт повторяющиеся слова: "hello hello".

6. Просмотр вперёд/назад (Lookarounds) 👀

Утверждения нулевой ширины — проверяют условие, не включая его в результат.

Синтаксис Название Проверка
(?=...) Положительный просмотр вперёд ... должно быть дальше.
(?!...) Отрицательный просмотр вперёд ... не должно быть дальше.
(?<=...) Положительный просмотр назад ... должно быть перед.
(?<!...) Отрицательный просмотр назад ... не должно быть перед.
Пример \d+(?=р) Найдёт число перед буквой "р", но само "р" не войдёт в совпадение.

7. Примеры кода на Python (Модуль re) 🐍

import re

text = "Телефоны: +7(903)123-4567 и 8 800 555 3535. Email: test@example.com."

pattern_email = r"[\w.-]+@[\w.-]+\.\w+"

pattern_phone = r"(\+7|8)[\s\(\-]*\d{3}[\s\)\-]*\d{3}[\s\-\/]*\d{2}[\s\-\/]*\d{2}"

# 1. re.search: Находит первое совпадение

match_email = re.search(pattern_email, text)

print(f"Первый Email: {match_email.group()}" if match_email else "Email не найден.")

# 2. re.findall: Находит все совпадения

phones = re.findall(pattern_phone, text)

print(f"Найденные номера (префиксы): {phones}")  # Внимание: захватывается только (\+7|8)

# 3. re.sub: Замена

new_text = re.sub(r"Email: \S+", "Email: [СКРЫТО]", text)

print(f"Текст после замены: {new_text}")

# 4. Группировка и Обратные ссылки

name = "Смирнов, Алексей"

new_name = re.sub(r"(\w+)\s*,\s*(\w+)", r"\2 \1", name)

print(f"Имя-Фамилия: {new_name}")  # → "Алексей Смирнов"
Лайк ( 1 ) Дизлайк ( 0 )

Создан: 2025-11-28

Обновлен: 2025-11-28 05:09