Python正则表达式添加HTML换行符的异常问题及疑惑
Python正则与Vim正则替换的差异原因
核心差异来自两者的替换逻辑本质不同:
Vim的\zs/\ze机制:
s:\(\.\)\zs\n\ze\(\.\):\<br \/\>:ge里的\zs和\ze是用来标记替换的精准区间,它们本身不匹配任何字符,只是告诉Vim:只替换\zs和\ze之间的内容(也就是这里的\n),前后的\(.\)只是作为匹配条件,不会被改动或包含在替换操作里。所以Vim会精准替换符合条件的换行符,不会影响其他字符。Python re的环视与替换逻辑:
你用的re.sub(r'(?<=.)\n(?=.)', r'<br />', body)中,(?<=.)和(?=.)是零宽断言,确实不占用匹配字符,理论上匹配的是满足“前后都有非空字符”的\n,替换后应该把这个\n换成<br />。但你遇到的异常,大概率是因为输入字符串里的换行是Windows风格的\r\n,你的正则只匹配了\n,替换后\r被保留了,导致输出中仍然存在换行(\r会触发换行行为),同时插入了<br />,看起来像是换行没被替换反而新增了标签。
如果要让Python的正则达到和Vim一样的效果,需要把正则改成匹配完整的换行符(兼容Unix和Windows格式):
re.sub(r'(?<=.)\r?\n(?=.)', r'<br />', body)
内容的提问来源于stack exchange,提问作者janeden
相关产品推荐
相关产品推荐

