2017-01-03 4 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> 
... 

*コメントは私が中に追加された、彼らは実際にファイルに存在しないが

**私の例では、値は連続していますが、私が今扱っているファイルではそうではありません。

***各インデントレベルは、レベルごとに4つのスペースで厳密にインデントされています。空白とのマッチングは重要ではありませんが、データを分ける必要があるだけですが、空白にも一致する方が簡単な場合は

最初のインデントのすべてのタグを一致させようとしています行(およびそれらのツリーのすべての内容)。理想的には、re.findallを使用して複数行の文字列のリストを生成したいのですが、複数行の文字列を生成することはできません。このために動作する式。

私はこの表現しようとしました:

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

をしかし、それは単に最後の試合がどうあるべきかの終わりに最初の試合がどうあるべきかの初めから1つの複数行の文字列にマッチします。

私はこの時点でこれを認めようと思っているよりもずっと長く苦労してきました。これにマッチする表現を作成する助けがあれば大いに感謝します。また、私はこれを非常にうまく説明できなかった場合には謝罪します。解決するためにもっと情報が必要な場合は教えてください!

+0

トライのXPath:http://www.freeformatter.com/xpath-tester.html – deathangel908

+0

あなたが実際にXMLファイル内のテキストのセクションを一致させたい、またはあなただけの特定のXMLを取得したいんですか要素?生のテキストにマッチさせるのではなく、XML構造を認識しているXPathのようなものを使うほうが簡単でしょう。 – BrenBarn

+0

[RegExはXHTML内蔵タグ以外のオープンタグと一致する可能性があります](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – inetphantom

答えて

0

コメントに記載されているように、その理由でXpathを使用する方が良いです。 XMLの

import libxml2 

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

うわー、私の終わりは、正規表現を使ってXMLを解析してはならないことを示しました。私はそれがなぜそれの良い例を見つけることができなかったのかを説明していると思います。私はlxmlを使用して終了し、それを通して解決策を思いついたので、ありがとう! –

関連する問題