Сложные шаблоны регулярных выражений
Вложенные группы захвата
import re
def parse_complex_data(text):
pattern = r'((\w+)\s(\w+))\s\[(\d+)\]'
match = re.match(pattern, text)
if match:
full_name = match.group(1)
first_name = match.group(2)
last_name = match.group(3)
id_number = match.group(4)
return {
'full_name': full_name,
'first_name': first_name,
'last_name': last_name,
'id': id_number
}
text = 'John Doe [12345]'
result = parse_complex_data(text)
print(result)
Несохраняющие группы (Non-Capturing Groups)
import re
def extract_domain_info(url):
## (?:) создает несохраняющую группу
pattern = r'https?://(?:www\.)?([^/]+)'
match = re.match(pattern, url)
if match:
domain = match.group(1)
return domain
url = 'https://www.example.com/path'
domain = extract_domain_info(url)
print(domain)
Просмотр вперед (Lookahead) и просмотр назад (Lookbehind)
import re
def validate_password(password):
## Положительный просмотр вперед для сложных правил пароля
pattern = r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$'
return re.match(pattern, password) is not None
passwords = [
'Weak1',
'StrongPass123!',
'NoSpecialChar123'
]
for pwd in passwords:
print(f"{pwd}: {validate_password(pwd)}")
Схема сложности шаблонов регулярных выражений
graph TD
A[Шаблон регулярного выражения] --> B{Уровень сложности}
B -->|Простой| C[Базовое сопоставление]
B -->|Средний| D[Группы захвата]
B -->|Продвинутый| E[Просмотр вперед/назад]
E --> F[Сложная валидация]
Продвинутые техники регулярных выражений
Техника |
Символ |
Описание |
Пример |
Несохраняющая группа |
(?:) |
Группировка без сохранения |
(?:www\.)? |
Положительный просмотр вперед |
(?=) |
Совпадает, если за ним следует... |
(?=.*\d) |
Отрицательный просмотр вперед |
(?!) |
Совпадает, если за ним не следует... |
(?!.*secret) |
Просмотр назад |
(?<=) |
Совпадает, если перед ним идет... |
(?<=\$)\d+ |
Рекурсивный парсинг
import re
def parse_nested_json(text):
pattern = r'\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}'
matches = re.findall(pattern, text)
return matches
json_like = '{key1: value1} {nested: {inner: value}}'
result = parse_nested_json(json_like)
print(result)
Рассмотрение производительности
import re
import timeit
def optimize_regex(pattern):
## Компилируем регулярное выражение для лучшей производительности
compiled_pattern = re.compile(pattern)
return compiled_pattern
## Бенчмарк компиляции регулярного выражения
pattern = r'(\w+)@(\w+)\.(\w+)'
compilation_time = timeit.timeit(
lambda: re.compile(pattern),
number=10000
)
print(f"Время компиляции: {compilation_time}")
Основные выводы
- Сложные шаблоны регулярных выражений требуют тщательного проектирования.
- Стратегически используйте несохраняющие группы и группы просмотра вперед.
- Компилируйте шаблоны регулярных выражений для повышения производительности.
- LabEx рекомендует постепенное изучение продвинутых техник.