正则表达式在xml中查找丢失的结束标记

时间:2019-12-17 20:14:39

标签: python regex xml

我有一些xml,它是带有一些不匹配标签的nlp提取工具。我试图使用正则表达式查找不匹配的标签并解决问题,但是我正卡在正则表达式部分。

我能够选择<Name>标签的所有实例,但是我只想选择不包含的结束标签,并使用replace添加匹配的结束标签。如何缩小尺寸并正确更换?

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)

1 个答案:

答案 0 :(得分:0)

您希望您的xx行是:

xx = re.sub("<Name>(?!.*</Name>)(.*)", r"<Name>\1</Name>", mmt)
  1. <Name>匹配<Name>
  2. (?!.*</Name>) 前瞻性,表示该行的其余部分不能包含</Name>
  3. (.*)与捕获组1中的其余行匹配。

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