Работа с регулярными выражениями в реальных задачах

Регулярные выражения — ваш мощный инструмент 🔍

Регулярные выражения (regex) — это не просто набор символов, а полноценный язык поиска внутри текста. Они позволяют находить, проверять и извлекать данные с невероятной гибкостью. Давайте разберёмся, как применять их в реальных задачах!


Основы работы с re модулем

В Python для работы с регулярными выражениями используется модуль re. Вот его ключевые функции:

import re

# Поиск первого совпадения
match = re.search(r'\d{3}', 'Телефон: 123-45-67')
print(match.group())  # '123'

# Поиск всех совпадений
numbers = re.findall(r'\d+', 'Возрасты: 25, 30, 42')
print(numbers)  # ['25', '30', '42']

# Разделение строки
parts = re.split(r'\s*,\s*', 'яблоки, апельсины, бананы')
print(parts)  # ['яблоки', 'апельсины', 'бананы']

# Замена текста
clean_text = re.sub(r'\s+', ' ', 'Много    лишних    пробелов')
print(clean_text)  # 'Много лишних пробелов'

Реальные кейсы применения 🛠️

1. Валидация вводимых данных

Проверка корректности email — классический пример:

def is_valid_email(email):
    pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return bool(re.fullmatch(pattern, email))

print(is_valid_email('user@example.com'))  # True
print(is_valid_email('invalid.email@'))    # False

Разберём паттерн:

  • ^ — начало строки
  • [a-zA-Z0-9_.+-]+ — один или больше допустимых символов
  • @ — обязательный символ
  • [a-zA-Z0-9-]+ — домен
  • \. — точка перед доменом верхнего уровня
  • $ — конец строки

2. Парсинг логов

Допустим, нужно извлечь IP-адреса из логов сервера:

log = "192.168.1.1 - GET /index.html 200\n10.0.0.2 - POST /submit 404"
ips = re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', log)
print(ips)  # ['192.168.1.1', '10.0.0.2']

3. Обработка текста с датами

Извлечение дат в разных форматах:

text = "События: 01.01.2023, 2023-12-31, 15/06/23"
dates = re.findall(r'\d{2}[./-]\d{2}[./-]\d{2,4}', text)
print(dates)  # ['01.01.2023', '15/06/23']

Продвинутые техники 🧠

Использование групп

Группы позволяют выделять части совпадения:

text = "Иван: +7 (123) 456-78-90, Мария: +375 29 1234567"
phones = re.findall(r'(\+\d{1,3})\s*[\(\s]*(\d{3})[\)\s]*(\d{3})[-\s]*(\d{2})[-\s]*(\d{2})', text)
for phone in phones:
    print(f"Код страны: {phone[0]}, номер: {''.join(phone[1:])}")

Ленивые и жадные квантификаторы

По умолчанию * и + жадные — захватывают максимально возможный текст. Добавление ? делает их ленивыми:

html = "<div>Первый</div><div>Второй</div>"

# Жадный квантификатор
print(re.findall(r'<div>.*</div>', html))  
# ['<div>Первый</div><div>Второй</div>']

# Ленивый квантификатор
print(re.findall(r'<div>.*?</div>', html))  
# ['<div>Первый</div>', '<div>Второй</div>']

Оптимизация производительности ⚡

  1. Компиляция регулярных выражений — если используете одно выражение многократно:
pattern = re.compile(r'\b[A-Z]\w*\b')  # Слова с заглавной буквы
matches = pattern.findall("Python Регулярные Выражения")
  1. Используйте атомарные группы для сложных выражений:
# Без атомарной группы
re.match(r'(?:\w+:|https?://)\S+', 'https://example.com/path')

# С атомарной группой (быстрее)
re.match(r'(?>\w+:|https?://)\S+', 'https://example.com/path')

Частые ошибки и как их избежать 🚧

  1. Экранирование специальных символов — не забывайте \ перед ., *, + и другими спецсимволами, когда хотите искать их буквально.

  2. Анкоры — используйте ^ и $ для точного соответствия всей строке.

  3. Многострочный режим — флаг re.MULTILINE меняет поведение ^ и $.

  4. Чрезмерно сложные выражения — иногда проще разбить задачу на несколько простых regex.


Практический пример: парсинг URL

Разберём URL на компоненты:

def parse_url(url):
    pattern = r'(https?)://([^/:]+)(?::(\d+))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?'
    match = re.match(pattern, url)
    if match:
        return {
            'protocol': match.group(1),
            'domain': match.group(2),
            'port': match.group(3),
            'path': match.group(4),
            'query': match.group(5),
            'fragment': match.group(6)
        }
    return None

url_data = parse_url('https://example.com:8080/path/to?param=value#section')
print(url_data)

Регулярные выражения — это мощный инструмент, который стоит освоить каждому разработчику. Начните с простых паттернов, постепенно усложняя их, и скоро вы сможете обрабатывать тексты любой сложности!

Для более глубокого изучения рекомендую курс Данилы Бежина по регулярным выражениям: https://www.youtube.com/@DanilaBezhin. Там разобраны десятки практических примеров из реальных проектов.

Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube