【问题标题】:Python non-greedy regex to clean xmlPython 非贪婪正则表达式来清理 xml
【发布时间】:2011-10-06 07:00:12
【问题描述】:

我有一个“xml 文件”文件,其中包含一些不需要的字符

<data>
  <tag>blar </tag><tagTwo> bo </tagTwo>
  some extra 
  characters not enclosed that I want to remove
  <anothertag>bbb</anothertag>
</data>

我认为以下非贪婪替换会删除未正确封装在 &lt;sometag&gt;&lt;/sometag&gt; 中的字符

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) 

这个正则表达式似乎只能在&lt;/tag&gt;[[]]&lt;tagTwo&gt; 中找到[[]] 指示的位置 我做错了什么?

编辑: 这个问题的动机已经解决(参见 cmets,我在 xml 文件中有一个杂散的 & 导致它无法解析 - 它与我要删除的字符无关)。但是,我仍然对正则表达式是否可行(以及我的尝试有什么问题)感到好奇,所以我没有删除这个问题。

【问题讨论】:

  • @cwallenpoole:我不想解析 xml。我正在尝试清理 xml 文件,以便我可以让它被解析器接受。欢迎任何有关如何执行此操作的非正则表达式建议
  • 哪个解析器不接受这个?
  • @IgnacioVazquez-Abrams xml.dom.mindom 我已编辑问题以包含回溯
  • 听起来你里面有一个杂散的&符号。
  • & 符号的字符实体引用是&amp;amp;。但是,您不能只做一个全局 S+R,因为这可能会弄乱其他有效的事情。

标签: python regex regex-greedy non-greedy


【解决方案1】:

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

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

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

我认为在定义要重复的字符类时尽可能精确是一种很好的做法。这有助于防止catastrophic backtracking。因此,我会使用[^&lt;]* 而不是.*?,另外它现在可以在最后一个标签之后找到杂散字符。这将不再需要 re.DOTALL 标志,因为 [^&lt;] 确实匹配换行符。

【讨论】:

    【解决方案2】:
     "</[^>]+?>[^<>]+?<" 
    

    在 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>'
    

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      相关资源
      最近更新 更多