我有一个“xml 文件”文件,其中包含一些不需要的字符
<data>
<tag>blar </tag><tagTwo> bo </tagTwo>
some extra
characters not enclosed that I want to remove
<anothertag>bbb</anothertag>
</data>
我认为以下非贪婪替换会删除 <sometag></sometag>
中未正确封装的字符。
re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text)
^ ^ ^ ^ text is the xml txt.
remember tag, | | put tag back without and reopen next tag
read everything until the next '<' (non-gready)
这个正则表达式似乎只能找到 [[]]
指示的位置在</tag>[[]]<tagTwo>
我做错了什么?
编辑: 这个问题的动机已经解决了(请参阅评论,我在 xml 文件中有一个杂散 & 导致它无法解析 - 它与我要删除的字符无关)。但是,我仍然很好奇正则表达式是否可行(以及我的尝试出了什么问题),因此我不会删除该问题。
最佳答案
点与换行符不匹配,除非您指定 re.DOTALL
标志。
re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text, flags=re.DOTALL)
应该可以正常工作。 (如果没有,是我的Python有问题,而不是正则表达式有问题。请更正。)
我认为在定义要重复的字符类时尽可能精确是一个很好的做法。这有助于防止catastrophic backtracking 。因此,我会使用 [^<]*
而不是.*?
额外的好处是它现在可以找到最后一个标签之后的杂散字符。这不需要 re.DOTALL
不再标记,因为 [^<]
确实匹配换行符。
关于Python非贪婪正则表达式来清理xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7671112/