按缩进级别匹配XML的Python正则表达式

按缩进级别匹配XML的Python正则表达式,python,regex,Python,Regex,我得到了一个XML文件,如下所示: ... <a foobar="1"> //Begin match here <a foobar="1"> <a foobar="1"> <a foobar="1"/> <a foobar="2"/> </a> <a foobar="2"> &l

我得到了一个XML文件,如下所示:

...
<a foobar="1">
    //Begin match here
    <a foobar="1">
        <a foobar="1">
            <a foobar="1"/>
            <a foobar="2"/>
        </a>
        <a foobar="2">
            <a foobar="3"/>
            <a foobar="4"/>
        </a>
    </a>
    //End match here
    //Begin match here
    <a foobar="2">
        <a foobar="2">
            <a foobar="5"/>
            <a foobar="6"/>
        </a>
    </a>
    //End match here
</a>
<a foobar="3">
    //Begin match here
    <a foobar="3">
        ...
    </a>
    //End match here
</a>
...
。。。
//从这里开始比赛
//比赛到此结束
//从这里开始比赛
//比赛到此结束
//从这里开始比赛
...
//比赛到此结束
...
*注释是我添加的,它们实际上不存在于文件中

**在我的示例中,这些值是连续的,而我现在处理的文件中不是这种情况

***每个缩进级别严格按每个级别缩进四个空格。匹配空白并不重要,因为我只需要能够分离数据,但是如果匹配空白更容易,那也没关系

本质上,我试图匹配第一个缩进行上的所有标记(以及它们树的所有内容)。这很棘手,因为所有标记都遵循命名结构

理想情况下,我希望使用re.findall生成一个多行字符串列表,但我无法找到一个适用于此的多行表达式

我试过这样的表达:

re.findall("\n( {4}<a foobar=\"[0-9]+\">.+ {4}</a>)\n", filecontents, re.DOTALL)
re.findall(“\n({4}.+{4})\n”,filecontents,re.DOTALL)
但这只是匹配一个多行字符串,从第一个匹配的开始到最后一个匹配的结束


我已经为此奋斗了很长时间,我不想承认在这一点上,任何帮助创造表达匹配这些将不胜感激。如果我不能很好地解释这一点,也很抱歉,如果你需要更多的信息来解决,请让我知道

正如我在评论中指出的,出于这个原因,最好使用它

import libxml2

doc = libxml2.parseFile("your_file.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//a")
print(res)
doc.freeDoc()
ctxt.xpathFreeContext()

尝试XPathforXML:您真的想匹配xml文件中的文本部分,还是只想获得某些xml元素?使用像XPath这样了解XML结构的东西可能更容易,而不是试图在原始文本上进行匹配。我想这就是为什么我找不到任何好的工作实例的原因。我最终使用了lxml,并提出了一个解决方案,谢谢!