让 AI 写正则表达式:用 9 个样本校验报名编号

从正反例提示词到可运行 Python 代码,练习报名编号校验、边界测试和异常行处理。

报名表里有四个编号:EVT-2026-0042、EVT-2026-42、evt-2026-0042、EVT-2026-0042-extra。哪一个能交给签到系统?如果约定是“大写 EVT、四位年份、四位流水号”,只有第一个合格。这个小问题很适合用来练习 AI 写正则表达式:规则明确,结果能当场检查,也能直接搬进日常数据整理工作。

本文面向处理表单、运营名单和内部工具的同事。我们用 Python 标准库完成一个可以复制运行的例子,从提出需求到得到逐行检查结果,不需要付费正则插件。AI 负责把自然语言规则改写成候选表达式,最终结果由本地代码检查。下面的编号均为虚构样本。

这次到底允许什么?把规则写到能判卷

编号的完整格式是 EVT-YYYY-NNNN。前缀必须大写,分隔符必须是英文半角连字符,年份与流水号各为四个 ASCII 数字。年份只检查四位格式,本次不限制具体年份;流水号允许以零开头,也允许 0000。字符串前后不能有空格或换行,编号后面不能夹带备注。这些细节决定了结果,不能等模型生成完再临时补充。

尤其要区分“检查这一格是不是编号”和“从一句话里找到编号”。前者要求整格符合规则,后者允许其他文字存在。本例做整格校验。若你的业务是从邮件中抽取编号,需要另写提取规则,不要把校验代码直接改成宽松匹配就上线。

把需求交给自己已有、获准使用的文字助手即可,例如站内的 Claude。选择它在这里的理由是方便围绕样本解释、修改规则,而非需要某种专属功能。短样本不需要上传整个报名文件,也不用为这个任务另买工具;真正要对接的是本地运行环境。

给 AI 的问题里带上正确答案

请为 Python 3 标准库 re 编写报名编号校验代码。格式为 EVT-YYYY-NNNN,必须大写 EVT,YYYY 和 NNNN 各四位 ASCII 数字,前后空白和额外字符都不允许,流水号允许 0000。不限制年份取值。使用整串匹配。先解释规则,再给候选表达式与一个返回 True/False 的函数。不要增加输入清理。正例 EVT-2026-0042、EVT-2026-0000;反例 EVT-2026-42、evt-2026-0042、EVT-2026-0042-extra、前面带空格的编号。补充边界样本,并说明这些样本分别在检查什么。

给正例只是起点,反例才会暴露过度宽松的表达式。模型如果返回“先 strip 再判断”,就已经改变了题目:带空格的原数据会被判成合格。清理可以是后续独立操作,但本轮需要先看清原始输入的问题。要求 AI 解释新增逻辑,是防止它顺手改变规则的有效办法。

运行这个小程序,结果应该是九行 PASS

将下面代码保存为 check_event_id.py,在装有 Python 3 的终端运行 python check_event_id.py;有些系统使用 python3。它不读写业务文件,只检查代码里的测试字符串。PASS 表示程序判断与预期一致,并不代表该行输入一定有效;反例被正确拒绝也会显示 PASS。

import re

pattern = re.compile(r"EVT-[0-9]{4}-[0-9]{4}")

def valid(value):
    return pattern.fullmatch(value) is not None

cases = [
    ("EVT-2026-0042", True),
    ("EVT-2026-0000", True),
    ("EVT-2026-42", False),
    ("evt-2026-0042", False),
    ("EVT-2026-0042-extra", False),
    (" EVT-2026-0042", False),
    ("EVT-2026-0042\n", False),
    ("EVT-2026-0042", False),
    ("", False),
]

for value, expected in cases:
    actual = valid(value)
    print("PASS" if actual == expected else "FAIL", repr(value), actual)
    assert actual == expected

这里用 fullmatch 要求整个字符串符合模式;[0-9] 明确限定 ASCII 数字。Python 的这些行为可在 re 官方文档核对。代码刻意保留了尾部换行和全角数字的反例,它们在肉眼检查时容易漏过。

样本没通过,怎样让 AI 精确修改

假设你拿到的另一个版本把小写前缀也接受了,不必重新发一句“还是不对”。把表达式、失败输入、实际结果和预期结果放在一起,限定只修正这一处。这样能避免它在修大小写时,又悄悄放宽流水号长度。每次修改后,重新运行所有样本,保留旧的反例。

当前代码如下。输入 evt-2026-0042 得到 True,但应为 False。请指出导致差异的具体语句,给出最小修改,并说明是否影响其他八个测试。不改变原需求,不自动清理空格,不把四位流水号改成可变长度。若建议增加测试,请给出输入、预期值和理由。

另一种情况是业务要求真的变了,比如新活动允许三位流水号。此时应该修改规则说明和测试预期,再修改表达式。把“程序有错”和“需求改变”分开记录,下个月复用时才知道为什么某种编号会被接受。

接入名单时,先输出异常行

测试完成后,在工作副本中逐行调用 valid。保留原行号、原编号和检查结果,将不合格行导出到异常列表。CSV 文件用 CSV 解析器读取,不要用这个编号正则去切割整行,因为引号或字段中的逗号会改变列边界。读取编号列时也应保留字符串类型,避免把前导零丢掉。

第一次处理真实批次,可以先跑几十行,抽查正常记录和异常记录各几条。发现空值、非字符串或缺少编号列时,应单独报告输入问题;上面的函数假设收到的是字符串,没有把所有类型错误都定义成编号错误。由表格读出的缺失值怎么处理,需要在调用函数之前约定。

校验格式也不会检查编号是否重复、活动是否存在、持有人是否已签到。将这些业务检查放在后续步骤:先确认格式,再按完整编号查重,最后到获准使用的系统核对记录。格式通过只是这条流水线的一个条件。

留给下一次使用的三份材料

  • 一段准确的规则说明,写清大小写、空白、位数和允许范围。
  • 一份同时包含正常、错误与边界输入的样本,逐条保存预期结果。
  • 实际运行通过的代码,以及使用的 Python 版本和本次修改原因。

当你想把表达式迁移到 JavaScript、表格软件或其他平台时,重新说明目标环境并运行同一批样本。表达式看起来相似,不等于匹配函数与转义方式相同。这个编号案例建立的习惯,也可以用在文件名、SKU 和内部工单号上:把需求变成可检查的输入输出,AI 的建议就有了明确的验收方式。

本文由 AI Islands 根据产品官网及公开资料独立整理。工具功能和价格可能变化,请以官网最新信息为准。