按缩进级别匹配XML的Python正则表达式
我得到了一个XML文件,如下所示:按缩进级别匹配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
...
<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,并提出了一个解决方案,谢谢!