Инструменты и когда регулярки НЕ нужны
Учимся отлаживать регулярки в специальных инструментах и распознавать задачи, где регулярка — неправильный выбор.
Регулярки описывают регулярные языки — линейные шаблоны. Вложенные структуры (HTML, JSON, выражения со скобками) им принципиально не по зубам.
Инструменты отладки
Писать сложный паттерн вслепую тяжело. Помогают онлайн-тестеры — самый известный regex101.com, есть также regexr.com и встроенный поиск-по-regex в редакторах (VS Code, PyCharm). Что они дают:
- Подсветку совпадений прямо в тексте по мере набора паттерна.
- Объяснение каждой части паттерна человеческим языком.
- Список групп и их содержимого.
- Выбор диалекта (Python, JS, PCRE) — важно из-за различий из прошлого урока.
- Предупреждения о потенциальном катастрофическом бэктрекинге.
Совет: собирайте сложный паттерн в тестере по кусочкам, на реальных примерах, и только потом переносите в код.
Главное ограничение: вложенность
У регулярок есть фундаментальный предел. Они описывают регулярные языки — по сути, линейные последовательности. А корректно разобрать произвольно вложенную структуру они не могут в принципе. Сколько ни усложняй паттерн, он не справится со всеми случаями вложенных тегов или скобок.
Не парсите HTML регулярками
Самая известная ловушка. На простом фрагменте регулярка вроде сработает, но реальный HTML полон вложенности, атрибутов с угловыми скобками в значениях, комментариев и незакрытых тегов. Сравните:
import re
# наивная попытка вытащить текст ссылки
html = '<a href="/x">ссылка</a>'
m = re.search(r'<a[^>]*>([^<]*)</a>', html)
print(m.group(1))
Вывод:
ссылка
На этом примере работает. Но добавьте вложенный тег внутрь ссылки (<a>текст <b>жирный</b></a>), атрибут со скобкой, перенос строки — и паттерн начнёт врать. Для HTML берут парсер: в Python это html.parser из стандартной библиотеки или BeautifulSoup. Они понимают структуру документа.
Не парсите JSON и языки регулярками
То же касается JSON, XML, кода программ, математических выражений со вложенными скобками. Для них есть json.loads, XML-парсеры, специализированные библиотеки. Регулярка не отследит баланс вложенных скобок — это не её класс задач.
Когда регулярка — правильный выбор
| Подходит | Лучше парсер/другой инструмент |
| проверка формата (email, индекс) | разбор HTML/XML |
| поиск/замена по шаблону | разбор JSON |
| извлечение из плоского текста | вложенные скобки/структуры |
| разбиение строк, очистка | полноценный язык программирования |
Простое правило: линейный шаблон — регулярка; вложенная структура — парсер.
Итог
- Отлаживайте паттерны в regex101 и подобных: подсветка, объяснение, группы, выбор диалекта.
- Регулярки не умеют в произвольную вложенность — это их теоретический предел.
- HTML, XML, JSON, код парсят специальными парсерами, а не регулярками.
- Линейный шаблон — регулярка; вложенная структура — парсер.