Что такое регулярные выражения в Python
Регулярные выражения (Regular Expressions, regex) в Python — это мощный инструмент для работы с текстовыми данными. Они позволяют осуществлять поиск, извлечение, проверку и замену текста на основе заданных шаблонов. Модуль re в Python предоставляет полный набор функций для работы с регулярными выражениями.
Синтаксис регулярных выражений
Специальные символы
| Символ | Описание |
|---|---|
. |
Любой символ, кроме символа новой строки (\n) |
^ |
Начало строки |
$ |
Конец строки |
* |
Ноль или более повторений предыдущего символа |
+ |
Одно или более повторений предыдущего символа |
? |
Ноль или одно повторение предыдущего символа |
{n} |
Ровно n повторений предыдущего символа |
{n,} |
Не менее n повторений предыдущего символа |
{n,m} |
От n до m повторений предыдущего символа |
\ |
Экранирование специальных символов |
[] |
Набор символов |
| ` | ` |
Специальные последовательности
| Последовательность | Описание |
|---|---|
\d |
Цифра (0-9) |
\D |
Не цифра |
\w |
Буквенно-цифровой символ (a-z, A-Z, 0-9, _) |
\W |
Не буквенно-цифровой символ |
\s |
Пробельный символ (пробел, табуляция, новая строка) |
\S |
Не пробельный символ |
\b |
Граница слова |
\B |
Не граница слова |
Группировка и модификаторы
| Элемент | Описание |
|---|---|
() |
Группировка символов |
\1, \2, ... |
Обратные ссылки на группы |
re.IGNORECASE (или re.I) |
Игнорировать регистр при сопоставлении |
re.MULTILINE (или re.M) |
Разрешить ^ и $ сопоставлять начало и конец каждой строки |
re.DOTALL (или re.S) |
Символ . соответствует любому символу, включая новую строку |
re.VERBOSE (или re.X) |
Позволяет использовать пробелы и комментарии в шаблоне |
Основные методы модуля re
1. re.compile(pattern, flags=0)
Компилирует регулярное выражение в объект Pattern для повторного использования.
import re
# Компилируем регулярное выражение для поиска чисел
pattern = re.compile(r'\d+')
text = 'Цена: 1500 рублей'
result = pattern.search(text)
print(result.group()) # Вывод: 1500
2. re.search(pattern, string, flags=0)
Ищет первое сопоставление регулярного выражения в строке.
import re
text = 'Телефон: +7 (123) 456-78-90'
match = re.search(r'\+\d{1,3}', text)
if match:
print(match.group()) # Вывод: +7
3. re.match(pattern, string, flags=0)
Ищет сопоставление регулярного выражения только в начале строки.
import re
text = '2023-12-25 - дата события'
match = re.match(r'\d{4}-\d{2}-\d{2}', text)
if match:
print(match.group()) # Вывод: 2023-12-25
4. re.findall(pattern, string, flags=0)
Находит все сопоставления и возвращает их в виде списка.
import re
text = 'Email: user@example.com, admin@site.ru'
emails = re.findall(r'\w+@\w+\.\w+', text)
print(emails) # Вывод: ['user@example.com', 'admin@site.ru']
5. re.finditer(pattern, string, flags=0)
Возвращает итератор объектов Match для всех сопоставлений.
import re
text = 'Цены: 100р, 250р, 500р'
matches = re.finditer(r'\d+', text)
for match in matches:
print(f'Найдено число: {match.group()} на позиции {match.start()}')
6. re.sub(pattern, repl, string, count=0, flags=0)
Заменяет все сопоставления на указанную подстановку.
import re
text = 'Дата: 25.12.2023'
# Заменяем формат даты с точек на дефисы
new_text = re.sub(r'(\d{2})\.(\d{2})\.(\d{4})', r'\3-\2-\1', text)
print(new_text) # Вывод: Дата: 2023-12-25
7. re.split(pattern, string, maxsplit=0, flags=0)
Разделяет строку по регулярному выражению.
import re
text = 'яблоки,груши;апельсины:мандарины'
fruits = re.split(r'[,;:]', text)
print(fruits) # Вывод: ['яблоки', 'груши', 'апельсины', 'мандарины']
Практические примеры использования
Валидация email адресов
import re
def validate_email(email):
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
print(validate_email('user@example.com')) # True
print(validate_email('invalid-email')) # False
Извлечение номеров телефонов
import re
text = '''
Контакты:
+7 (123) 456-78-90
8-800-555-35-35
+7 987 654 32 10
'''
phone_pattern = r'\+?[78][-\s]?(?:\(\d{3}\)|\d{3})[-\s]?\d{3}[-\s]?\d{2}[-\s]?\d{2}'
phones = re.findall(phone_pattern, text)
print(phones)
Работа с HTML тегами
import re
html = '<p>Это параграф</p><div>Это div</div>'
# Удаляем все HTML теги
clean_text = re.sub(r'<[^>]+>', '', html)
print(clean_text) # Вывод: Это параграфЭто div
Поиск слов определенной длины
import re
text = 'Python это мощный язык программирования'
# Найти все слова длиной от 5 до 8 символов
long_words = re.findall(r'\b\w{5,8}\b', text)
print(long_words) # Вывод: ['Python', 'мощный']
Группы захвата и именованные группы
import re
text = 'Дата рождения: 15.03.1990'
# Использование групп захвата
match = re.search(r'(\d{2})\.(\d{2})\.(\d{4})', text)
if match:
day, month, year = match.groups()
print(f'День: {day}, Месяц: {month}, Год: {year}')
# Именованные группы
pattern = r'(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})'
match = re.search(pattern, text)
if match:
print(f'Год: {match.group("year")}')
Советы по оптимизации
1. Компилируйте регулярные выражения для повторного использования
import re
# Неэффективно - компилируется каждый раз
for text in texts:
re.search(r'\d+', text)
# Эффективно - компилируется один раз
pattern = re.compile(r'\d+')
for text in texts:
pattern.search(text)
2. Используйте raw строки
# Правильно
pattern = r'\d+\.\d+'
# Неправильно - требует двойного экранирования
pattern = '\\d+\\.\\d+'