通过缩进级别

时间:2017-01-03 19:54:19

标签: 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">
            <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>
...

*我添加了评论,它们实际上并不存在于文件

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

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

基本上,我试图匹配第一个缩进行上的所有标记(以及它们所有树的内容)。这很棘手,因为所有标签都遵循命名结构&lt; foob​​ar =&#34;#&#34; &GT;

理想情况下,我想使用re.findall生成多行字符串列表,但我无法想出一个可用于此的多行表达式。

我试过这个表达:

re.findall("\n( {4}<a foobar=\"[0-9]+\">.+ {4}</a>)\n", filecontents, re.DOTALL)

但是,这只是从一个应该是第一个匹配的开头到应该是最后一个匹配的结尾的一个多行字符串匹配。

我一直在努力解决这个问题的时间远远超过我想承认的时候,任何帮助创建符合这些表达的表达都会非常感激。如果我不能很好地解释这一点,也要道歉,如果您需要更多信息要解决,请告诉我!

1 个答案:

答案 0 :(得分:0)

正如我在评论中所指出的那样,出于这个原因使用Xpath会更好。

import libxml2

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