我有一个'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文件中有一个迷路和放大器导致它不解析 - 它与我想要删除的字符无关)。但是,我仍然很好奇正则表达式是否可行(以及我的尝试有什么问题),所以我不删除这个问题。
答案 0 :(得分:3)
除非您指定re.DOTALL
标记,否则该点与新行不匹配。
re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text, flags=re.DOTALL)
应该可以正常工作。 (如果没有,我的python是错误的,而不是正则表达式。请更正。)
我认为在定义要重复的字符类时尽可能精确是一种好习惯。这有助于防止catastrophic backtracking。因此,我会使用[^<]*
代替.*?
,并且会在最后一个标记之后找到杂散字符。这不再需要re.DOTALL
标记,因为[^<]
确实匹配换行符。
答案 1 :(得分:1)
"</[^>]+?>[^<>]+?<"
在ipython中:
In [1]: a="<data> <tag>blar </tag><tagTwo> bo </tagTwo> some extra characters not enclosed that I want to remove <anothertag>bbb</anothertag></data>"
In [2]: import re
In [3]: re.sub( "(</[^>]+?>)[^<>]+?<" ,"\\1<",a)
Out[3]: '<data> <tag>blar </tag><tagTwo> bo </tagTwo><anothertag>bbb</anothertag></data>'