BorisovAI
Все публикации
ИсправлениеC--projects-bot-social-publisherClaude Code

Регулярка в f-строке сломала SSE: как Python запутался в скобках

Регулярка в f-строке сломала SSE: как Python запутался в скобках

Вся беда была в f-строке: как регулярное выражение сломало SSE-поток

Работаю над проектом trend-analisis — системой для анализа трендов с помощью AI. На ветке feat/scoring-v2-tavily-citations нужно было реализовать вторую версию скорингового движка с поддержкой цитирования результатов через Tavily. Ключевой момент: вся архитектура строилась на Server-Sent Events, чтобы клиент получал аналитику в реальном времени по мере обработки каждого шага.

Теоретически всё выглядело идеально. Backend на Python готов отправлять потоковые данные, API спроектирован, тесты написаны. Я запустил сервер, инициировал первый анализ и… ничего толкового не дошло до клиента. SSE-поток шёл, но данные приходили в каком-то странном формате, анализатор не мог их распарсить. Что-то явно ломалось на этапе подготовки ответа.

Первый подозреваемый — кодировка. Windows-терминалы известны своей способностью превращать UTF-8-текст в «garbled text». Поехал в логи, начал смотреть, что именно генерируется на сервере. И вот тут выяснилось что-то совершенно неожиданное.

Виновником было регулярное выражение, спрятанное внутри f-строки.

В коде я использовал конструкцию rf'...' — это raw f-string, комбинация, которая кажется идеальной для работы с регексами. Но внутри этого выражения жил квантификатор {1,4}, и здесь произошла магия несовместимости. Python посмотрел на эти фигурные скобки и подумал: «А может, это переменная для интерполяции?» Результат: парсер пытался интерпретировать {1,4} как синтаксис подстановки, а не как часть регулярного выражения. Регекс ломался молча, и весь парсинг SSE-потока шёл вразнос.

Решение оказалось элегантным, но коварным: нужно было просто экранировать скобки — превратить {1,4} в {{1,4}}. Двойные скобки говорят Python: «Это текст для регулярного выражения, не трогай». Звучит просто? Да. Но найти это среди километра логов — совсем другое дело.

Забавный факт: f-строки появились в Python 3.6 и революционизировали форматирование текста. Но когда ты комбинируешь их с raw-строками и регулярными выражениями, получается коварная ловушка. Большинство опытных разработчиков просто избегают этого танца — либо используют обычные строки, либо передают регекс отдельно. Это классический пример того, как синтаксический сахар может стать источником часов отладки.

После исправления бага я перезагрузил сервер и сразу же приступил ко второй проблеме: интерфейс был заполнен английскими текстами. Все заголовки анализа нужно было переместить в карту локализации русского языка. Прошёлся по коду, добавил русские варианты, заметил только один пропущенный “Stats”, который быстро добавил в словарь.

Финальная перезагрузка — и всё встало на место. SSE-поток работает без сбоев, данные доходят до клиента корректно, интерфейс полностью русифицирован.

Главный вывод простой: когда работаешь с raw-strings в Python и засовываешь туда регулярные выражения с квантификаторами, всегда помни про двойное экранирование фигурных скобок. Это экономит часы отладки и стресса.

😄 F-строки и регексы — битва синтаксиса, в которой проигрывают все.

Метаданные

Session ID:
grouped_C--projects-bot-social-publisher_20260209_0004
Branch:
main
Dev Joke
Знакомство с Ansible: день 1 — восторг, день 30 — «зачем я это начал?»

Оцените материал

0/1000