Что такое regex, зачем нужен, базовые концепции и области применения
Регулярные выражения — это язык описания шаблонов текста. Один хорошо написанный regex может заменить десятки строк кода с циклами и условиями.
Регулярное выражение (regex, regexp) — это последовательность символов, которая определяет шаблон для поиска в тексте.
Регулярные выражения используются для:
Рассмотрим задачу: найти все email-адреса в тексте.
Без regex (много кода, сложно):
text = "Контакты: support@example.com и sales@test.org"
emails = []
for word in text.split():
if '@' in word and '.' in word:
parts = word.split('@')
if len(parts) == 2 and '.' in parts[1]:
emails.append(word)
print(emails) # ['support@example.com', 'sales@test.org']С regex (одна строка):
import re
text = "Контакты: support@example.com и sales@test.org"
emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
print(emails) # ['support@example.com', 'sales@test.org']# Проверка email
is_valid = bool(re.match(r'^[\w.-]+@[\w.-]+\.\w+$', email))
# Проверка телефона
is_valid = bool(re.match(r'^\+7\d{10}$', phone))
# Проверка пароля (минимум 8 символов, буквы и цифры)
is_valid = bool(re.match(r'^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$', password))log_line = "2024-03-09 14:30:15 ERROR [main] Database connection failed"
# Извлечение уровня логирования и сообщения
match = re.search(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\w+) \[(\w+)\] (.+)', log_line)
if match:
timestamp, level, logger, message = match.groups()html = '<a href="https://example.com">Link</a>'
# Извлечение URL
url = re.search(r'href="([^"]+)"', html).group(1)
# 'https://example.com'text = "Цена: 1 234,56 руб."
# Удаление пробелов и замена запятой на точку
price = re.sub(r'\s+', '', text) # "Цена:1234,56руб."
price = re.sub(r',', '.', price) # "Цена:1234.56руб."
# Извлечение числа
value = float(re.search(r'[\d.]+', price).group()) # 1234.56data = "Order #12345: $99.99; Order #67890: $149.50"
# Извлечение всех заказов
orders = re.findall(r'Order #(\d+): \$(\d+\.\d{2})', data)
# [('12345', '99.99'), ('67890', '149.50')]Регулярное выражение состоит из:
Литералы — обычные символы, соответствующие самим себе
re.search(r'cat', 'The cat sat') # Найдёт 'cat'Метасимволы — символы со специальным значением
re.search(r'c.t', 'cat') # '.' — любой символ
re.search(r'c*t', 'ccct') # '*' — ноль или болееКлассы символов — наборы допустимых символов
re.search(r'[aeiou]', 'hello') # Любая гласная
re.search(r'\d+', 'abc123') # \d — цифраВ Python регулярные выражения определяются через модуль re:
import re
# Компиляция паттерна (рекомендуется для повторного использования)
pattern = re.compile(r'\d+')
# Поиск
result = pattern.search('abc123def')Для regex в Python рекомендуется использовать сырые строки с префиксом r:
# Правильно — обратная косая черта не экранируется Python
pattern = r'\d+\.\d+'
# Неправильно — нужно экранировать обратную косую черту
pattern = '\\d+\\.\\d+'Сырые строки делают regex более читаемыми и менее подверженными ошибкам.
| Функция | Описание |
|---|---|
re.match(pattern, string) | Поиск в начале строки |
re.search(pattern, string) | Поиск по всей строке |
re.findall(pattern, string) | Найти все совпадения |
re.finditer(pattern, string) | Итератор по совпадениям |
re.sub(pattern, repl, string) | Замена совпадений |
re.split(pattern, string) | Разбиение строки |
re.compile(pattern) | Компиляция паттерна |
import re
text = """
Контакты компании:
Email: info@company.com, support@company.co.uk
Телефон: +7 (495) 123-45-67, +7-800-555-35-35
Сайт: https://www.company.com
"""
# Извлечение email
emails = re.findall(r'[\w.-]+@[\w.-]+\.\w+', text)
# Извлечение телефонов
phones = re.findall(r'\+7[\s()\-0-9]{10,}', text)
# Извлечение URL
urls = re.findall(r'https?://[\w./-]+', text)
print(f"Email: {emails}")
print(f"Телефоны: {phones}")
print(f"URL: {urls}")Парсинг HTML/XML — используйте BeautifulSoup, lxml
# Плохо:
re.search(r'<title>(.*)</title>', html)
# Хорошо:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
title = soup.title.stringСложные вложенные структуры — regex не может парсить рекурсивные структуры
Простые задачи — если можно сделать через str.split(), str.replace() — делайте так
rer'...') для паттерновВ следующих темах мы подробно изучим синтаксис и возможности регулярных выражений.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.