代码之家  ›  专栏  ›  技术社区  ›  carousallie

在xml中查找缺少结束标记的正则表达式

  •  -1
  • carousallie  · 技术社区  · 5 年前

    我有一些xml,即将推出一个带有一些不匹配标记的nlp提取工具。然后我试图使用regex来查找不匹配的标记并纠正问题,但是我在regex部分遇到了麻烦。

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

    实际结果 xx (<Name>.*)</Name> 但我需要它 <Name>Margrethe II</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 回复  |  直到 5 年前
        1
  •  0
  •   Booboo    5 年前

    你想要你的 xx 行为:

    xx = re.sub("<Name>(?!.*</Name>)(.*)", r"<Name>\1</Name>", mmt)
    
    1. <Name> 比赛 <名称>
    2. (?!.*</Name>) 一个 消极展望 也就是说这行的其余部分不能包含 </Name>
    3. (.*) 与捕获组1中的行的其余部分匹配。

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