2

我有一个“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 文件中有一个杂散的 & 导致它无法解析 - 它与我要删除的字符无关)。但是,我仍然对正则表达式是否可行(以及我的尝试有什么问题)感到好奇,所以我没有删除这个问题。

4

2 回答 2

3

re.DOTALL除非您指定标志,否则点不匹配换行符。

re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text, flags=re.DOTALL)

应该可以正常工作。(如果没有,我的 python 有问题,而不是正则表达式。请更正。)

我认为在定义要重复的字符类时尽可能精确是一种好习惯。这有助于防止灾难性的回溯。因此,我会使用它现在在最后一个标签之后找到杂散字符[^<]*而不是.*?额外的好处。这将不再需要该re.DOTALL标志,因为[^<]确实匹配换行符。

于 2011-10-06T13:42:08.733 回答
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>'
于 2011-10-06T14:02:33.540 回答