2016-10-28 9 views
1

を文字列を分割するために、私は私のアプローチが分裂したこと正規表現が同じブロックに

[['ip-address','1.1.1.1/16','protocol','ospf','ll',4],['ip-address','3.3.3.3/32','ip-addr','2.2.2.2','ip-addr','8.8.8.8','type',route]]

a=''' <att> 
     <rt> 
     <rts> 
     <ip-address>1.1.1.1/16</ip-address> 
     <bb> 
      <cc> 
      <protocol>ospf</protocol> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <ll>4</ll> 
      </ff> 
     </ee> 
     </rts> 
     <rts> 
     <ip-address>3.3.3.3/32</ip-address> 
     <bb> 
      <cc> 
      <ip-addr>2.2.2.2</ip-addr> 
      <ip-addr>8.8.8.8</ip-addr> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <type>route</type> 
      </ff> 
     </ee> 
     </rts> 
     <rt> 
     </att>''' 

以下のようにデータにPythonで正規表現を使用して、以下のXMLからリストに挿入、それを取得したいです複数の文字列と、検索に上記の単一の文字列、たとえば

b= '''<rts> 
     <ip-address>1.1.1.1/16</ip-address> 
     <bb> 
      <cc> 
      <protocol>ospf</protocol> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <ll>4</ll> 
      </ff> 
     </ee> 
     </rts>''' 

c= '''<rts> 
     <ip-address>3.3.3.3/32</ip-address> 
     <bb> 
      <cc> 
      <ip-addr>2.2.2.2</ip-addr> 
      <ip-addr>8.8.8.8</ip-addr> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <type>route</type> 
      </ff> 
     </ee> 
     </rts>''' 

私は、複数の文字列を作成するには、次の正規表現を使用

regex = re.findall(r"<(rts)>.*<\ /rts)", a, re.S) 

しかし、それはすべてが以下のように文字列の末尾をそれまではフェッチ、

 <rts> 
    <ip-address>1.1.1.1/16</ip-address> 
    <bb> 
     <cc> 
     <protocol>ospf</protocol> 
     </cc> 
    </bb> 
    <ee> 
     <ff> 
     <ll>4</ll> 
     </ff> 
    </ee> 
    </rts> 
    <rts> 
    <ip-address>3.3.3.3/32</ip-address> 
    <bb> 
     <cc> 
     <ip-addr>2.2.2.2</ip-addr> 
     <ip-addr>8.8.8.8</ip-addr> 
     </cc> 
    </bb> 
    <ee> 
     <ff> 
     <type>route</type> 
     </ff> 
    </ee> 
    </rts> 

は、私が上に示した「B」と「C」などの文字列を分割することができる可能性が方法はありますか?

+5

正規表現でXMLを解析することは、一般的には悪い考えです。適切な特別なライブラリの使用を検討してください – agg3l

+1

あなたのregexについては、貪欲でないマッチ '。*? 'に調整する必要があります – agg3l

+1

Pythonには、XML、[' xml.etree.ElementTree'](https: /docs.python.org/2/library/xml.etree.elementtree.html) – augurar

答えて

1

lxmlとxpathを使用すると、独自のregexパーサをローリングするよりもはるかに簡単にxmlを解析できます。ここ

は、例えば次のとおり

import lxml 
import StringIO 

a =''' <att> 
     <rt> 
     <rts> 
     <ip-address>1.1.1.1/16</ip-address> 
     <bb> 
      <cc> 
      <protocol>ospf</protocol> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <ll>4</ll> 
      </ff> 
     </ee> 
     </rts> 
     <rts> 
     <ip-address>3.3.3.3/32</ip-address> 
     <bb> 
      <cc> 
      <ip-addr>2.2.2.2</ip-addr> 
      <ip-addr>8.8.8.8</ip-addr> 
      </cc> 
     </bb> 
     <ee> 
      <ff> 
      <type>route</type> 
      </ff> 
     </ee> 
     </rts> 
     </rt> 
     </att>''' 

f = StringIO.StringIO(a) 
tree = lxml.etree.parse(f) 

rts = tree.xpath('//rts') 

ipa = rts[0].xpath(".//ip-address")[0] 

print ipa.text 

これは、最初のRTSタグ、すなわち1.1.1.1/16の最初のIPアドレスを印刷します。

注: xmlを修正する必要がありました。最後のrtタグに/ missingがありました。

関連する問題