如何设置正则表达式模式,排除指定符号及特定换行格式?
正则表达式排除规则实现方案
需求概述
需要修改变量some_text的正则表达式,使其:
- 可匹配大小写字母、数字及大部分符号(如:、$、#、&等)的子串
- 绝对禁止匹配两类内容:
- 分号(
;) .后跟任意空白/|字符再跟换行符\n的格式(例如. \n、.|\n这类组合)
- 分号(
- 需满足给定测试用例的输出规则:匹配到目标模式时输出
0,未匹配时输出1
测试用例说明
| 输入文本 | 预期输出 | 标记 |
|---|---|---|
"Recien el 2021-10-12 despues de 3 dias 2021-10-12" | 1 | NOT PASS |
"Recien el 2021-10-12 hsah555sahsdhj. Ya despues de 3 dias hjsdfhjdsfhjdsf 2021-10-12" | 1 | NOT PASS |
"Recien el 2021-10-12 hsah555sahsdhj; despues de 3 dias hjsdfhjdsfhjdsf 2021-10-12" | 1 | NOT PASS |
"Recien el 2021-10-12 hsah555sahsdhj despues de 3 dias hjsdfhjdsfhjdsf.\\n 2021-10-12" | 1 | NOT PASS |
"Recien el 2021-10-12 hsah555sahsdhj; mmm... creo que ya despues de 3 dias hjsdfhjdsfhjdsf.\\n 2021-10-12" | 0 | PASS |
"Recien el 2021-10-12 hsah555sahsdhj. \\\\n\\\\n\\\\n mmm... creo que ya despues de 3 dias hjsdfhjdsfhjdsf.\\n 2021-10-12" | 0 | PASS |
解决方案
可以通过单个正则模式实现所有排除规则,修改后的some_text如下:
some_text = r"(?:(?!;|\.(?:[\s|]+\\n)).)*"
正则逻辑拆解
(?:...):非捕获组,用于包裹整体匹配逻辑,避免额外捕获分组(?!;|\.(?:[\s|]+\\n)):负向前瞻断言,确保当前位置后不会出现两类禁用内容:;:直接匹配分号\.(?:[\s|]+\\n):匹配.后跟任意数量的空白/|字符,再衔接换行符\n的组合
.:匹配任意单个字符(除原生换行符,原测试用例中的\\n为转义后字符,正则会正常识别)*:允许匹配0到多个符合条件的字符
测试验证
将修改后的some_text替换原代码变量后运行:
- 前4个NOT PASS用例:因日期与目标短语之间存在禁用模式(直接含分号,或存在
. \n类格式),check_00和check_01均无法匹配,输出1 - 最后2个PASS用例:禁用模式出现在目标短语的非关联位置,日期与目标短语之间的内容符合
some_text规则,check_00可成功匹配,输出0
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

