Шпаргалка по регулярным выражениям в Python

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

1import re

Для экранирования служебных символов используются два подхода:

  • Обратный слэш (\)
  • Сырые строки (r"...")

Основные функции работы с регулярными выражениями

  • re.match(r'шаблон', строка) — Ищет совпадение с началом строки.
  • re.search() — Ищет первое совпадение в строке и возвращает объект match.
  • re.span() — Возвращает кортеж с начальной и конечной позицией фрагмента.
  • re.string() — Возвращает исходную строку, переданную в re.search().
  • re.group() — Возвращает найденное совпадение.
  • re.findall() — Ищет все совпадения и возвращает их списком.
  • re.split() — Разделяет строку по указанному шаблону.
  • re.sub() — Заменяет найденный фрагмент в строке по шаблону.
  • re.compile() — Создает объект регулярного выражения для дальнейшего использования.

Основные синтаксические элементы

  • . — Любой символ, кроме новой строки.
  • ^ — Начало строки.
  • $ — Конец строки.
  • * — 0 или более вхождений.
  • + — 1 или более вхождений.
  • ? — 0 или 1 вхождение.
  • {n} — Точное количество вхождений.
  • {n,m} — От n до m вхождений.
  • [] — Набор символов.
  • \ — Экранирование символов.
  • | — Логическое ИЛИ.
  • () — Группировка выражений.
  • [^...] — Любой символ, кроме указанных в квадратных скобках.

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

  • \w — Любая буква, цифра или подчеркивание.
  • \W — Все, кроме букв, цифр и подчеркивания.
  • \d — Любая цифра (0-9).
  • \D — Любой нецифровой символ.
  • \s — Пробел или символ новой строки.
  • \S — Все, кроме пробельных символов.
  • \A — Начало строки.
  • \Z — Конец строки.
  • \b — Граница слова.
  • \B — Не граница слова.
  • \n, \t, \r — Новая строка, табуляция, возврат каретки.

Флаги регулярных выражений

  • g (global) — Продолжает поиск совпадений после первого найденного.
  • m (multi-line) — Позволяет использовать ^ и $ для начала и конца каждой строки в многострочном тексте.
  • i (insensitive) — Игнорирует регистр символов.

Простые примеры регулярных выражений

1. Поиск слов, начинающихся с буквы "a" и заканчивающихся на "z"

1import re
2
3pattern = r'a\w*z'
4text = "apple, azure, amazing, puzzle, jazz"
5result = re.findall(pattern, text)
6print(result)  # ['azure', 'amazing']
  • \w* — соответствует любым символам (буквы, цифры или подчеркивания) между буквами "a" и "z".

2. Поиск всех чисел в строке

1pattern = r'\d+'
2text = "Цены: 500 рублей, 3000 долларов и 45 евро."
3result = re.findall(pattern, text)
4print(result)  # ['500', '3000', '45']
  • \d+ — ищет одно или более чисел.

3. Поиск слов, содержащих букву "e"

1pattern = r'\b\w*e\w*\b'
2text = "Hello there, welcome to the world of regex!"
3result = re.findall(pattern, text)
4print(result)  # ['there', 'welcome', 'regex']
  • \b — граница слова, \w* — любые символы.

4. Поиск слов с определенной длиной

1pattern = r'\b\w{5}\b'
2text = "Apple is a fruit, and tiger is an animal."
3result = re.findall(pattern, text)
4print(result)  # ['Apple', 'tiger']
  • \w{5} — ищет слова длиной ровно 5 символов.

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

1. Поиск и валидация номера телефона (формат: +7 (999) 123-45-67)

1pattern = r'\+7\s?\(\d{3}\)\s?\d{3}-\d{2}-\d{2}'
2text = "Мой номер: +7 (999) 123-45-67, и еще один номер +7(912)345-67-89."
3result = re.findall(pattern, text)
4print(result)  # ['+7 (999) 123-45-67', '+7(912)345-67-89']
  • \+7 — ищет код страны.
  • \(\d{3}\) — код города, состоящий из 3 цифр в скобках.
  • \d{3}-\d{2}-\d{2} — основная часть номера телефона с дефисами.

2. Валидация электронной почты

1pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
2text = "Моя почта: [email protected], еще один адрес [email protected]."
3result = re.findall(pattern, text)
4print(result)  # ['[email protected]', '[email protected]']
  • [a-zA-Z0-9_.+-]+ — имя пользователя, может содержать буквы, цифры, подчеркивания, точки и дефисы.
  • @[a-zA-Z0-9-]+ — домен до точки, допускаются буквы и цифры.
  • \.[a-zA-Z0-9-.]+ — доменная зона после точки, например .com или .ru.

3. Поиск IP-адресов (формат: 192.168.0.1)

1pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
2text = "Серверы: 192.168.0.1, 10.0.0.255, 8.8.8.8."
3result = re.findall(pattern, text)
4print(result)  # ['192.168.0.1', '10.0.0.255', '8.8.8.8']
  • \d{1,3} — три цифры (или меньше).
  • (?:\d{1,3}\.){3} — повторяет блок цифр и точку 3 раза.
  • \d{1,3} — завершающий блок из одной, двух или трех цифр.

4. Поиск дат в формате (дд.мм.гггг)

1pattern = r'\b\d{2}\.\d{2}\.\d{4}\b'
2text = "Мероприятие состоится 25.12.2024, а предыдущая дата была 01.01.2023."
3result = re.findall(pattern, text)
4print(result)  # ['25.12.2024', '01.01.2023']
  • \d{2} — день и месяц в формате из двух цифр.
  • \d{4} — год в формате из четырех цифр.

5. Удаление всех HTML-тегов из текста

1pattern = r'<.*?>'
2html_text = "<div><h1>Заголовок</h1><p>Текст статьи</p></div>"
3clean_text = re.sub(pattern, '', html_text)
4print(clean_text)  # ЗаголовокТекст статьи
  • <.*?> — ищет все, что заключено в угловые скобки.

Эти примеры показывают, как можно использовать регулярные выражения для решения как простых, так и сложных задач, таких как валидация данных и обработка текста. Вы можете адаптировать эти шаблоны под свои нужды в зависимости от конкретной задачи.

Полезные ссылки

comments powered by Disqus

Translations: