Работа с регулярными выражениями в реальных задачах
Регулярные выражения — ваш мощный инструмент 🔍
Регулярные выражения (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>']
Оптимизация производительности ⚡
- Компиляция регулярных выражений — если используете одно выражение многократно:
pattern = re.compile(r'\b[A-Z]\w*\b') # Слова с заглавной буквы
matches = pattern.findall("Python Регулярные Выражения")
- Используйте атомарные группы для сложных выражений:
# Без атомарной группы
re.match(r'(?:\w+:|https?://)\S+', 'https://example.com/path')
# С атомарной группой (быстрее)
re.match(r'(?>\w+:|https?://)\S+', 'https://example.com/path')
Частые ошибки и как их избежать 🚧
-
Экранирование специальных символов — не забывайте
\перед.,*,+и другими спецсимволами, когда хотите искать их буквально. -
Анкоры — используйте
^и$для точного соответствия всей строке. -
Многострочный режим — флаг
re.MULTILINEменяет поведение^и$. -
Чрезмерно сложные выражения — иногда проще разбить задачу на несколько простых 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. Там разобраны десятки практических примеров из реальных проектов.