Регулярные выражения нейросетью: как получить рабочий regex и проверить его

Модель пишет regex быстро, но уверенно ошибается на граничных случаях. Показываем запрос с примерами, цикл с автопроверкой и защиту от зависаний.

5 мин · · разработка · автоматизация

Нейросеть для регулярных выражений экономит самое неприятное: вспоминать синтаксис и подбирать экранирование. Но выражение, которое выглядит правильно, часто ломается на строке, которую вы не показали. Надёжный способ работы такой: описать задачу примерами, получить regex с объяснением, прогнать его на тестовых строках в коде и только после этого использовать. Ниже запрос, скрипт с автопроверкой и список ловушек. Скрипт на Python, но подход одинаков для любого языка.

Как описывать задачу

Словесное описание («найти номера телефонов») оставляет слишком много свободы. Дайте модели четыре вещи:

  1. Диалект. Python re, JavaScript, PCRE, Go RE2: они различаются (поддержка lookbehind, именованных групп, юникода). Без указания диалекта вы получите синтаксис наугад.
  2. Что должно совпадать. Список строк, которые обязаны подойти.
  3. Что не должно. Список строк, которые обязаны быть отвергнуты. Именно отрицательные примеры отличают рабочее выражение от слишком жадного.
  4. Режим. Нужна ли проверка всей строки или поиск внутри текста; нужны ли группы захвата.

Пример запроса:

bash
Диалект: Python re. Режим: проверка всей строки целиком.
Нужен regex для российских телефонов в форматах +7 (912) 345-67-89,
8 912 345 67 89, +79123456789, 8(912)3456789.
Должны совпадать: [список]. Не должны: [список].
Верни JSON с полями pattern, explanation (по частям) и risks
(что может сработать неожиданно). Только JSON.

Требование «по частям» важно: объяснение позволяет вам прочитать выражение и понять его, а не доверять вслепую.

Автопроверка в коде

Модель не запускает выражение, поэтому проверяем сами. Скрипт просит у модели regex, прогоняет его на положительных и отрицательных примерах и при ошибках возвращает модели список провалов.

bash
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, но не полагайтесь только на её оценку.

bash
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.

Нейросеть для регулярных выражений: regex и проверка · Zukko