2017-01-03 20 views
0

我因爲看起來像這樣的XML文件:Python的正則表達式的縮進級別匹配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> 
... 

*評論都是我加了進來,它們實際上並不存在的文件中

**在我的例子中,這些值是連續的,在我現在處理的文件中不是這種情況

***每個縮進級別嚴格按每級別四個空格縮進。匹配空格不重要,因爲我只需要能夠分離數據,但如果它更容易匹配空白,那麼這也很好

本質上,我試圖匹配第一個縮進上的所有標記行(及其樹的所有內容)。這很棘手,因爲所有的標籤遵循命名結構< foobar =「#」>

理想情況下,我想使用re.findall生成多行字符串的列表,但我不能想出一個多行表達式可以爲此工作。

我試過這個表達式:

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

但是,單純從什麼應該是第一個匹配的應該是什麼最後一場比賽結束時開始匹配一個多行字符串。

我一直在努力爭取這個時間比我現在要承認的要長得多,任何幫助創建匹配這些表達式的表達都將不勝感激。也道歉,如果我不能很好地解釋這一點,如果你需要更多的信息來解決請讓我知道!

+0

嘗試的XPath對XML:http://www.freeformatter.com/xpath-tester.html – deathangel908

+0

你真的想在XML文件中匹配的部分文字,或者你只是想獲得某些XML元素?使用XPath之類的知道XML結構的東西可能更容易,而不是嘗試匹配原始文本。 – BrenBarn

+0

[RegEx match open tags not except XHTML self-contained tags]可能重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – inetphantom

回答

0

正如我在評論中指出的那樣,最好使用Xpath

import libxml2 

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

哇,看起來像一個進一步的研究我的結果表明,不應該使用正則表達式來解析XML。我想這解釋了爲什麼我找不到任何好的工作示例。我最終使用了lxml並通過它提出了一個解決方案,所以謝謝! –