Регулярные выражения нейросетью: как получить рабочий regex и проверить его
Модель пишет regex быстро, но уверенно ошибается на граничных случаях. Показываем запрос с примерами, цикл с автопроверкой и защиту от зависаний.
5 мин · · разработка · автоматизация
Нейросеть для регулярных выражений экономит самое неприятное: вспоминать синтаксис и подбирать экранирование. Но выражение, которое выглядит правильно, часто ломается на строке, которую вы не показали. Надёжный способ работы такой: описать задачу примерами, получить regex с объяснением, прогнать его на тестовых строках в коде и только после этого использовать. Ниже запрос, скрипт с автопроверкой и список ловушек. Скрипт на Python, но подход одинаков для любого языка.
Как описывать задачу
Словесное описание («найти номера телефонов») оставляет слишком много свободы. Дайте модели четыре вещи:
- Диалект. Python
re, JavaScript, PCRE, Go RE2: они различаются (поддержка lookbehind, именованных групп, юникода). Без указания диалекта вы получите синтаксис наугад. - Что должно совпадать. Список строк, которые обязаны подойти.
- Что не должно. Список строк, которые обязаны быть отвергнуты. Именно отрицательные примеры отличают рабочее выражение от слишком жадного.
- Режим. Нужна ли проверка всей строки или поиск внутри текста; нужны ли группы захвата.
Пример запроса:
Диалект: Python re. Режим: проверка всей строки целиком.
Нужен regex для российских телефонов в форматах +7 (912) 345-67-89,
8 912 345 67 89, +79123456789, 8(912)3456789.
Должны совпадать: [список]. Не должны: [список].
Верни JSON с полями pattern, explanation (по частям) и risks
(что может сработать неожиданно). Только JSON.Требование «по частям» важно: объяснение позволяет вам прочитать выражение и понять его, а не доверять вслепую.
Автопроверка в коде
Модель не запускает выражение, поэтому проверяем сами. Скрипт просит у модели regex, прогоняет его на положительных и отрицательных примерах и при ошибках возвращает модели список провалов.
import json
import re
from openai import OpenAI
client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")
POSITIVE = ["+7 (912) 345-67-89", "8 912 345 67 89", "+79123456789", "8(912)3456789"]
NEGATIVE = ["+7 (912) 345-67", "912 345 67 89", "+1 912 345 67 89", "12345678901234"]
TASK = (
"Диалект: Python re, проверка всей строки (будет использован fullmatch). "
"Нужен regex для российских телефонов. "
f"Должны совпадать: {POSITIVE}. Не должны: {NEGATIVE}. "
'Верни только JSON: {"pattern": "...", "explanation": "..."}.'Принцип: модель предлагает, код проверяет, ошибки возвращаются в диалог. Если за три попытки выражение не прошло проверку, чаще всего задача описана неполно: добавьте примеры. Пример показывает цикл на Python, но тот же самый принцип работает и с JavaScript или другим языком: меняется только функция check.
Ловушки, которые тесты не поймают
Катастрофический возврат (ReDoS). Выражения со вложенными повторениями вроде (a+)+$ на подходящей строке работают экспоненциально долго и могут подвесить сервис. Если regex применяется к пользовательскому вводу, проверьте его на длинной «почти подходящей» строке и поставьте ограничение на длину входа или используйте движок без возвратов (RE2). Просите модель отдельно оценить это в поле risks, но не полагайтесь только на её оценку.
import re, time
rx = re.compile(r"^(\d+)+$")
bad = "1" * 22 + "x"
t = time.perf_counter()
rx.match(bad)
print(f"{time.perf_counter() - t:.2f} с")Если время растёт при добавлении символов в bad, выражение опасно.
Юникод. \w и \d в разных диалектах по-разному относятся к кириллице и нелатинским цифрам. Если у вас русский текст, добавьте такие строки в примеры.
Границы. Нужны ли ^ и $, \b, многострочный режим. Укажите в запросе режим: проверка всей строки или поиск внутри текста.
Валидация «по-настоящему». E-mail, URL, даты и ИНН регулярным выражением полностью не проверить. Для такого лучше готовая библиотека или проверка контрольной суммы. Regex подходит для формата, а не для смысла.
Читаемость и сопровождение
Попросите модель написать выражение в многострочном режиме с комментариями (re.VERBOSE в Python) и положите объяснение рядом в коде. Через полгода вы сами не вспомните, что делает группа (?:\+7|8). Хорошая привычка: оставить в репозитории файл с тестовыми строками, которыми вы проверяли выражение. Это те же примеры, и они пригодятся при любом изменении. Если нужен именно тестовый набор, попросите модель сгенерировать дополнительные граничные примеры, а затем вручную проверьте, что их метки (совпадает или нет) верны: модель иногда ошибается именно в метке.
Сколько это стоит
Один запрос: примерно 1 000 токенов входа (задача, примеры) и 500 выхода. Формула: вход × цена входа + выход × цена выхода. Цены на 18 октября 2026, $ за 1M токенов:
claude-sonnet-5-5(0,4 / 2): 0,001 × 0,4 + 0,0005 × 2 = 0,0004 + 0,001 = $0,0014.gpt-6.1-sol(0,27 / 1,32): 0,001 × 0,27 + 0,0005 × 1,32 = 0,00027 + 0,00066 = $0,00093.glm-5.3-flash(0,04 / 0,04): 0,001 × 0,04 + 0,0005 × 0,04 = 0,00004 + 0,00002 = $0,00006.
С тремя попытками, где в каждой следующей накапливается история, сумма вырастет до нескольких десятых цента на Sonnet. Для такой задачи стоимость почти не влияет на выбор: важнее, как модель справляется с вашим диалектом. Попробуйте дешёвую, и если не проходит проверка, переключитесь на сильнее. Сила моделей по индексу Artificial Analysis в каталоге: GLM 5.3 Flash — 42, GPT-6.1 Sol — 52, Sonnet 5.5 — 48; это не гарантия, проверьте на своих примерах. Цены меняются — актуальные отдаёт GET https://api.zukko.pro/v1/models.
Полное описание эндпоинта: Chat Completions. Если хотите, чтобы модель отвечала строго в JSON, прочитайте про структурированный ответ. Для генерации кода в целом полезна статья про промпты для программиста.
Чтобы запустить скрипт, создайте ключ в кабинете и пополните баланс: СБП, карта MasterCard или криптовалюта.
Частые вопросы
Можно ли доверять regex от нейросети без проверки?
Нет. Выражение выглядит убедительно, но может ошибаться на граничных случаях. Всегда прогоняйте его на положительных и отрицательных примерах и проверяйте на ReDoS.
Какая нейросеть лучше для генерации кода и регулярок?
Заранее не скажем. Для regex решает не выбор модели, а проверка в коде. Сравните две-три модели на своих примерах.
Как получить регулярку для другого языка?
Укажите диалект в запросе и проверяйте тестами на этом языке. В JavaScript, Go и Python различаются именованные группы, lookbehind и юникод.
Что делать, если выражение получилось слишком сложным?
Разбейте задачу: сначала грубое сопоставление регулярным выражением, затем проверка кодом. Часть логики проще и надёжнее выразить обычными условиями.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Перевод субтитров нейросетью: SRT без сбитых таймкодовГлавный риск при переводе SRT нейросетью — сломанная структура файла. Показываем схему, где таймкоды не попадают к модели, и скрипт на Python с проверкой.
- Редактирование текстов нейросетью: корректура, стиль и сокращениеРазные виды редактуры требуют разных промптов. Показываем формулировки для корректуры, стиля и сокращения, как получать правки с объяснением и не терять авторский голос.
- Нейросеть для написания скриптов: Bash, PowerShell и PythonМодель быстро пишет скрипты для рутины, но запускать их вслепую нельзя. Показываем, как ставить задачу, требовать безопасный режим dry-run и проверять результат до запуска.
- Dify в Docker: установка, первичная настройка и подключение моделейСтавим Dify через Docker Compose, создаём администратора и подключаем модели Claude, GPT и DeepSeek по одному ключу. Отдельно — что делать, если контейнеры не стартуют.