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

标签 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 文件中有一个杂散 & 导致它无法解析 - 它与我要删除的字符无关)。但是,我仍然很好奇正则表达式是否可行(以及我的尝试出了什么问题),因此我不会删除该问题。

最佳答案

点与换行符不匹配,除非您指定 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/

相关文章:

python - 关于 autocorrelation_plot 结果与 autocorr 结果的问题

python - 即使我给它向前看和向后看的要求,正则表达式是否总是贪婪的?

用于在 WebHarvy 中提取电子邮件的正则表达式

使用 SWIG 的 C++ 类

python - 将特定位置的字符串替换成文本,然后重写所有文本

python - Scrapy中如何控制yield的顺序

regex - 带括号和单词边界的 Mongo $regex

javascript - 如何查找以特定字母开头的单词?

ruby - 匹配与上一组匹配的相同数量的字符

用于传递 URL 和失败 CIDR 掩码的正则表达式