我想使用python中的regex从下面的XML中获取数据并将其放入列表中,如下所示
[['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>'''我的方法是将上面的单个字符串划分为多个字符串,然后进行搜索,例如
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”?
发布于 2016-10-28 16:22:37
与使用自己的regex解析器相比,使用lxml和xpath可以更容易地解析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标记的第一个ip地址,即1.1.1.1/16。
注意:我需要修复您的xml,在最后的rt标记上有一个/缺失。
https://stackoverflow.com/questions/40298671
复制相似问题