【问题标题】:regex to find missing closing tag in xml正则表达式在 xml 中查找缺少的结束标记
【发布时间】:2019-12-17 20:14:39
【问题描述】:

我有一些 xml,它是一个带有一些不匹配标签的 nlp 提取工具。我试图然后使用正则表达式来查找不匹配的标签并纠正问题,但我被困在正则表达式部分。

我可以选择<Name> 标签的所有实例,但我只想选择那些没有结束标签的实例,并使用替换来添加匹配的结束标签。如何缩小范围并正确更换?

xx 的实际结果是(<Name>.*)</Name>,但我需要它是<Name>Margrethe II</Name>

查找: <Name>.*

替换: (<Name>.*)</Name>

import re

mmt = """<Sovereigns>
    <Queens>
        <Queen>
            <Name>Elizabeth II</Name>
            <Country>Great Britain and Northern Ireland</Country>
        </Queen>
        <Queen>
            <Name>Margrethe II
            <Country>Denmark</Name></Country>
        </Queen>
    </Queens>
</Sovereigns>"""

# remove extra closing tag
x = re.sub("</Name><", "<", mmt)
# add closing tag to those missing
xx = re.sub("<Name>.*", "(<Name>.*)</Name>", mmt)

【问题讨论】:

  • 这些查找/替换操作是否只需要在单行上进行?
  • 我认为这可能是非法的,但不确定&lt;Name&gt;Margrethe II &lt;Country&gt;Denmark&lt;/Name&gt;&lt;/Country&gt;
  • 查找r"(?s)(&lt;Name&gt;(?:(?!&lt;).)*(?=&lt;|$)(?!&lt;/Name&gt;))"替换r"\1&lt;/Name&gt;"

标签: python regex xml


【解决方案1】:

您希望您的xx 行是:

xx = re.sub("<Name>(?!.*</Name>)(.*)", r"<Name>\1</Name>", mmt)
  1. &lt;Name&gt; 匹配 &lt;Name&gt;
  2. (?!.*&lt;/Name&gt;) 一个负前瞻,表示该行的其余部分不得包含 &lt;/Name&gt;
  3. (.*) 匹配捕获组 1 中的其余行。

替换包含对捕获组 1 的反向引用。

【讨论】:

  • 但这一切的前提是&lt;Name&gt;&lt;/Name&gt;这些开始和结束标签都在一行上。您还有额外的问题:&lt;Country&gt;Denmark&lt;/Name&gt;&lt;/Country&gt;
  • 我在原来的帖子中搞砸了,但&lt;Country&gt;Denmark&lt;/Name&gt;&lt;/Country&gt;x = re.sub("&lt;/Name&gt;&lt;", "&lt;", mmt) 处理。在我的实际数据中,我还没有遇到任何不在一行上的标签(谢天谢地)。但这看起来正是我所需要的,谢谢!
  • 我总是愿意学习,所以无论谁投了反对票,请帮我告诉我这有什么不足。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多