Python非贪婪的正则表达式来清理xml

时间:2011-10-06 07:00:13

标签: python regex regex-greedy non-greedy

我有一个'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文件中有一个迷路和放大器导致它不解析 - 它与我想要删除的字符无关)。但是,我仍然很好奇正则表达式是否可行(以及我的尝试有什么问题),所以我不删除这个问题。

2 个答案:

答案 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>'