使用Python的re.sub替换Markdown特殊字符时出现后续字符被“吞噬”的问题求助
使用Python的re.sub替换Markdown特殊字符时出现后续字符被“吞噬”的问题求助
嘿,我来帮你揪出这个问题的根源!你遇到的字符被“吞掉”的情况,其实是因为你的正则表达式里多了一个不该有的 . 符号,另外字符集里的 - 写法也有小坑。
咱们来拆解一下问题:
你的正则是 (?P<markdown>[\'*-_{}\[\]<>()#+-.!]). —— 末尾的 . 会匹配特殊字符紧接着的下一个任意字符,也就是说每次匹配都会选中两个字符:一个是你要转义的Markdown特殊字符,另一个是它后面的字符。而你在替换时只输出了转义后的特殊字符,那个被 . 匹配到的后续字符就直接被丢弃了,这就是为什么:
- 原字符串里的
-变成了\-(空格没了) (1变成了\((数字1丢了)
另外,字符集里的#+-.会把-当成范围符号(匹配从#到.的ASCII字符),这会导致你意外匹配到一些不需要转义的字符,得把-移到字符集开头或结尾,让它变成普通字符。
修正方案很简单:
- 去掉正则末尾的
.,只匹配特殊字符本身 - 调整字符集里
-的位置,避免被当成范围
修正后的代码如下:
import re string = 'delivery - options (1 of 3)' # 去掉末尾的`.`,把`-`移到字符集结尾避免范围问题 markdown_pattern = re.compile(r"(?P<markdown>[\'*__{}\[\]<>()#+.!-])") result = markdown_pattern.sub(r'\\\g<markdown>', string) print(result) print(len(string)) print(len(result))
运行这段代码,你会得到预期的结果:
delivery \- options \(1 of 3\)
额外补充:之前你的结果和原字符串长度相同,是因为每次匹配2个字符、替换成2个字符(\ + 特殊字符),总长度不变但丢失了内容;修正后每个特殊字符会被替换成两个字符(转义符+原字符),结果长度会比原字符串长,这才是正常转义后的状态。
备注:内容来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

