如何优化正则表达式以满足三连破折号的特定替换规则?
如何优化正则表达式以满足三连破折号的特定替换规则?
看起来你已经搞定了“只匹配恰好三个连续破折号”的核心逻辑,差就差在排除「破折号位于行尾(允许后面跟空白)」的特殊情况对吧?我来帮你调整正则表达式~
你之前的(?<!-)---(?!-)已经用负向前后查找确保了前后没有额外的破折号,但没处理「---后面只有空白就到行尾」的场景。我们需要在这个基础上,给正则加一个额外的判断:三连破折号后面不能是「任意空白字符+行尾」的组合。
修改后的正则表达式如下:
(?<!-)---(?!-|\s*$)
这里的关键是扩展了负向超前断言部分:(?!-|\s*$),它的意思是——三连破折号后面既不能是另一个破折号(避免匹配四个及以上连续破折号),也不能是「零个或多个空白字符紧接着行尾」的情况(也就是排除你说的“行尾三连破折号”场景)。
我们用你的测试案例来验证效果:
import re text1 = "a---b" text2 = "a\n --- \nb" for text in [text1, text2]: print(repr(re.sub("(?<!-)---(?!-|\s*$)", "X", text)))
运行后的输出完全符合你的预期:
'aXb' 'a\n --- \nb'
再额外补充几个边界场景的测试,确保规则覆盖全面:
text3 = "end---" # 行尾直接跟---,不替换 text4 = "end--- " # ---后面跟空白再行尾,不替换 text5 = "mid---mid" # 中间的---,正常替换 for text in [text3, text4, text5]: print(repr(re.sub("(?<!-)---(?!-|\s*$)", "X", text)))
输出结果:
'end---' 'end--- ' 'midXmid'
简单拆解下正则的各个部分:
(?<!-):负向回溯断言,确保三连破折号前面不是破折号,避免误匹配四个及以上连续破折号---:精准匹配三个连续破折号(?!-|\s*$):负向超前断言,同时排除两种情况:后面是破折号、后面是空白加行尾
这样就完美满足你的两个替换规则啦!
备注:内容来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

