DeepSeek生成正则表达式时,提示词里要写哪些背景信息
想让DeepSeek生成的正则表达式真正能用?提示词里得把那些能约束匹配边界的背景信息给装进来,否则它只会输出那些泛化过度、锚点缺失、Unicode失效的正则字符串——看起来像模像样,实际上跑不动。
这里必须说清楚四类背景信息。
必须提供的四类背景信息
第一类,运行环境和语法标准。比如,你得写明“使用Python re 模块”或“兼容ECMAScript 2024”。DeepSeek默认是按Python解析的,但它不会主动声明。如果你目标是Ja vaScript环境却没提,它可能就混用了QE这类非通用语法,运行起来直接报错。
第二类,输入文本的真实结构特征。不是只扔一句“匹配错误日志”就完事。得说清楚“每行一条日志,格式为[时间] 错误码:消息,中间有空格分隔”。没有这个上下文,DeepSeek很容易忽略行首行尾、字段分隔符、固定前缀这些关键的边界信号。
第三类,字符集真实范围。要匹配中文姓名,就得写明“姓名由2–4个汉字组成”,光写“匹配人名”远远不够。
【w在Python中默认不匹配汉字】
第四类,常见干扰模式及其位置。比如“日志末尾常带残缺URL如https://www.php.c,需排除”,或者“配置行可能以#开头,整行应被跳过”。DeepSeek可不会自动识别这些干扰。你得把它们作为负向断言的触发条件,写进背景信息里。
两种典型场景的背景写法对比
先说方法一:日志行整体校验(强结构化文本)。背景信息要包含:“输入是单行纯文本,无前后空格;字段间用单个空格分隔;时间戳固定为[YYYY-MM-DD HH:MM:SS]格式;错误码为全大写英文+数字组合,长度3–8位;消息部分可含任意可见ASCII字符,但不含换行”。
再看方法二:HTML片段中提取属性值(弱结构化文本)。背景信息要包含:“源文本是未清洗的HTML片段,可能含注释、JS内联代码、多余空格及换行;目标是从中提取src属性值;值被双引号包裹,但存在少数用单引号或无引号的情况;需跳过srcset等相似属性”。
最容易被忽略的背景细节
更要注意的是,必须写明是否允许前后空白。如果输入来自readlines(),每行自带n,而你没提,DeepSeek生成的正则很可能因为缺少^s*和s*$,导致re.match()失败。
还要说明大小写敏感性。不要写“不区分大小写”,而要写“
【请添加(?i)前缀】
如果用于re.sub()替换场景,需要额外声明“保留原始空格结构,仅替换匹配到的数字部分”。不然它可能生成带s+的贪婪模式,把周围空格一并吞掉。