Попросить нейросеть «напиши регулярное выражение для номера заказа»
недостаточно. Она не знает, допустимы ли пробелы, нужны ли только
латинские символы и надо ли проверить всю строку или найти фрагмент
внутри сообщения. Выражение может выглядеть правильно, но пропускать
лишние данные.
Надёжнее дать короткую спецификацию, примеры совпадений и исключений,
а затем выполнить результат на контрольных строках. Разберём три задачи:
номер заказа, метку рекламной кампании и дату в тексте. Примеры
действительно запущены в Python 3.12.14 со стандартным модулем re. Это
редакционный учебный набор, а не сравнительный тест ChatGPT или другой
модели.
Что указать в промпте
Начните с движка: Python re, JavaScript или другой вариант. Не все
конструкции и правила одинаково работают в разных средах. Затем опишите
допустимый формат, ограничения и нужный результат: да или нет, найденная
подстрока либо несколько именованных полей.
Отдельно задайте способ сопоставления. В Python re.fullmatch
проверяет всю строку; re.search ищет первое подходящее место; re.match
начинает проверку с начала строки, но сам по себе не требует, чтобы
совпадение заняло её целиком. Если вы проверяете поле формы, обычно
нужен первый вариант. Если извлекаете дату из фразы, второй.
Не пишите просто «цифры», если система принимает только символы 0–9.
Для строк Unicode конструкция \d в Python охватывает не только этот
набор. Также решите, нужно ли удалять пробелы до проверки. В наших
примерах исходные строки сохраняются без очистки: незаметный перенос
строки должен считаться ошибкой, а не исправляться автоматически.
Базовый шаблон запроса:
Нужен regex для Python 3.12, стандартный модуль re.
Задача: [проверить всю строку / найти первое совпадение].
Допустимый формат: [точные правила].
Запрещено: [пробелы, лишний суффикс и другие исключения].
Должно пройти: [примеры].
Не должно пройти: [примеры].
Верни выражение, способ вызова и объяснение ограничений.
Не меняй входную строку перед проверкой.
Если условия противоречат друг другу, сначала укажи конфликт.
Оставьте часть примеров для проверки после получения выражения. Иначе
легко убедиться только в том, что оно подходит к уже показанным строкам.
В нашем наборе для каждой задачи шесть примеров видимые и четыре
отложенные. Эталонные ответы зафиксированы до написания исполняемых
выражений; это не слепой эксперимент над моделью, поскольку выражения
подготовлены редакционно.
Номер заказа без лишних
символов
Пусть номер состоит из ORD- и шести цифр 0–9. Префикс только
прописными латинскими буквами. Пробелы, дополнительные символы и перевод
строки недопустимы.
Промпт:
Составь регулярное выражение для Python re.
Проверь всю строку: ORD- и ровно шесть ASCII-цифр 0–9.
Регистр фиксирован. Запрещены пробелы и переводы строк.
Принимаем ORD-123456 и ORD-000001.
Отклоняем ORD-12345, ORD-1234567, ord-123456
и строку с пробелом перед ORD-123456.
Покажи вызов fullmatch, не используй strip.
Проверяемое решение:
import re
pattern = r"ORD-[0-9]{6}"
ok = re.fullmatch(pattern, "ORD-123456") is not None
print(ok) # True
Префикс здесь буквальный, [0-9] ограничивает символы, а {6} задаёт их
количество. fullmatch исключает совпадение только с частью входа. Запись
r перед кавычками делает строку Python сырой и упрощает использование
обратных косых черт в более сложных шаблонах.
Две ошибки в коротком
выражении
Для демонстрации мы намеренно взяли редакционный ошибочный
вариант:
re.match(r"^ORD-\d{6}$", value) is not None
Он прошёл 8 из 10 проверок. В число ошибочно принятых попали
ORD-123456 с полноширинными цифрами и ORD-123456 с конечным
переводом строки. Причины разные: \d шире ASCII-цифр, а $ в Python может
совпадать перед конечным символом новой строки. Замена на fullmatch и
[0-9] дала 10 из 10 на том же наборе.
Это специально сконструированный пример ошибки, а не сохранённый
неудачный ответ нейросети. Его удобно использовать как дополнительный
запрос после обнаружения похожей проблемы:
Выражение принимает полноширинные цифры и конечный перевод строки,
хотя спецификация их запрещает. Объясни обе причины и исправь
выражение и способ вызова. Сохрани все ранее допустимые значения.
Метка кампании с отдельными
полями
Вторая задача: проверить метку вида email_launch_2026 и получить
channel, topic, year. Канал и тема содержат по 2–12 строчных латинских
букв; между полями подчёркивания; год состоит из четырёх ASCII-цифр.
Диапазон года пока не ограничиваем: это поле метки, а не календарная
дата.
Для Python re проверь всю строку с форматом channel_topic_year.
channel и topic: от 2 до 12 строчных латинских букв, без цифр.
year: ровно четыре ASCII-цифры. Ограничения диапазона года нет.
Извлеки поля в именованные группы channel, topic и year.
Принимаем email_launch_2026 и vk_sale_2026.
Отклоняем a_sale_2026, Email_sale_2026, email_sale_26
и email_sale_2026_x. Не исправляй регистр или пробелы.
Решение с именованными группами:
pattern = (
r"(?P<channel>[a-z]{2,12})_"
r"(?P<topic>[a-z]{2,12})_"
r"(?P<year>[0-9]{4})"
)
match = re.fullmatch(pattern, "email_launch_2026")
fields = match.groupdict() if match else None
print(fields)
Результат содержит channel=email, topic=launch и year=2026.
Именованные группы удобнее позиционных номеров: видно назначение каждого
поля. Если совпадения нет, возвращаем None и не пытаемся читать группы
несуществующего объекта.
На нашем наборе решение прошло 10 из 10 проверок. В том числе оно
отклонило кириллицу, полноширинные цифры и пробел внутри темы. Метку
telegram_news_0000 оно приняло: четыре цифры соответствуют заданию. Если
нужны только годы 2020–2030, это новое требование, которое следует
добавить явно и проверить отдельно, а не приписывать выражению задним
числом.
Дата в сообщении и
проверка календаря
В третьей задаче надо найти первую отдельную дату ДД.ММ.ГГГГ внутри
фразы. Слева и справа не должно быть буквы, цифры или подчёркивания.
Формат допускает день 01–31 и месяц 01–12, но существование даты
проверяется вторым шагом.
Напиши regex для Python re.search: извлечь первую отдельную дату
ДД.ММ.ГГГГ из строки. Цифры только ASCII. Именованные группы
day, month, year. День 01–31, месяц 01–12, год четыре цифры.
Не находить дату внутри слова или идентификатора: рядом не должны
стоять Unicode-буквы, цифры или подчёркивание.
Примеры: «Срок: 24.10.2026.» и «29.02.2024».
Regex проверяет форму, а datetime.date — календарную корректность.
Если первая найденная дата не существует, сообщи об этом,
не переходя незаметно к следующей дате в тексте.
Разделяем поиск и смысловую проверку:
from datetime import date
pattern = (
r"(?<!\w)"
r"(?P<day>0[1-9]|[12][0-9]|3[01])\."
r"(?P<month>0[1-9]|1[0-2])\."
r"(?P<year>[0-9]{4})"
r"(?!\w)"
)
match = re.search(pattern, "Срок: 29.02.2025.")
if match:
fields = match.groupdict()
try:
checked = date(
int(fields["year"]),
int(fields["month"]),
int(fields["day"]),
)
print(checked.isoformat())
except ValueError:
print("Дата найдена, но в календаре её нет")
else:
print("Подходящий формат даты не найден")
29.02.2025 и 31.04.2026 подходят по форме, но не существуют в
календаре. 29.02.2024 проходит обе проверки. Год 0000 тоже отклоняется
при создании date. Важно различать отсутствие подходящей подстроки и
найденную, но неверную дату: для исправления данных это разные
ситуации.
Границы с \w в этом примере остаются Unicode-границами. Не добавляйте
флаг re.ASCII ко всему выражению без пересмотра условия: он меняет смысл
не только \d, но и \w. Если нужны все даты, а не первая, следует
отдельно изменить алгоритм и решить, как обрабатывать каждую ошибку.
Что показала проверка
24 октября 2026 года выполнены 30 исходных проверок: по 10 на каждую
задачу. Все результаты совпали с заранее сохранённым эталоном; 12 из
этих строк были выделены как отложенные. Отдельная посимвольная
реализация без regex сверила эталон, а ещё 12 дополнительных граничных
случаев также прошли проверку.
Эти результаты относятся только к опубликованному набору и указанной
версии Python. Они не доказывают качество конкретной нейросети или
безопасность выражений на любом объёме данных. В комплекте примера (ZIP)
находятся исходные строки, ожидаемые значения, исполняемый код и полный
журнал результатов.
Для воспроизведения положите файлы в одну папку и выполните python
run_tests.py, затем python independent_check.py. Сторонние библиотеки и
подключение к сервисам не нужны. Вторая программа использует другой
алгоритм проверки, но не является независимой человеческой
экспертизой.
Перед использованием на
своих данных
Сначала проверьте выражение на копии небольшого набора, а не на
рабочей базе. Добавьте реальные исключения, которые допустимо
использовать: пустую строку, максимальную длину, похожие символы другого
алфавита, переводы строк и текст до или после значения. Не передавайте в
чат реальные клиентские данные ради нескольких примеров формата.
Не усложняйте regex, если задачу проще решить обычной проверкой
длины, разделением строки или специализированным парсером. Особенно
осторожно относитесь к повторениям внутри повторений и к длинным внешним
входам: успешный тест на коротких строках не гарантирует приемлемого
времени работы. Ограничивайте длину входа и проверяйте поведение в
отдельной среде с внешним ограничением времени.
Хороший промпт для regex заканчивается не просьбой «сделай идеально»,
а проверяемым контрактом: что принимается, что отклоняется, какие поля
извлекаются и чем подтверждается результат. Ответ нейросети после этого
остаётся предложением кода. Решение использовать его принимает проверка
на ваших правилах и данных.
