Python正则表达式替换问题:为何<t>的起始<字符丢失?
re.sub处理字符串丢失起始<字符的原因
原始代码
import re contents="""<tag> </tag><t>text</t>""" shorted= re.sub(r'(?s)<tag>.*?</tag>[^\w\s]*', '', contents).replace('\n', '') print(shorted) print()
执行结果与预期差异
- 实际执行输出:
t>text</t> - 预期输出:
<t>text</t>(转义后为<t>text</t>) - 问题:
<t>的起始<字符丢失
原因分析
问题出在正则表达式的[^\w\s]*部分:
[^\w\s]表示匹配任意非字母数字、非空白的字符,*表示匹配0次或多次- 目标字符串中
</tag>后面紧跟的是<t>的<,这个<属于非字母数字、非空白字符,因此被[^\w\s]*匹配到,和前面的<tag>...</tag>一起被替换为空字符串,最终导致<t>的起始<被删除。
修复思路
可以调整正则表达式避免误匹配<:
- 方案1:将
[^\w\s]*改为[^\w\s<]*,排除<的匹配:shorted= re.sub(r'(?s)<tag>.*?</tag>[^\w\s<]*', '', contents).replace('\n', '') - 方案2:如果仅需去除
</tag>后的空白/换行,直接用\s*替代[^\w\s]*更精准:shorted= re.sub(r'(?s)<tag>.*?</tag>\s*', '', contents).replace('\n', '')
内容的提问来源于stack exchange,提问作者Rec
相关产品推荐
相关产品推荐

