我想使用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”?
答案 0 :(得分:1)
使用lxml和xpath,您可以比滚动自己的正则表达式解析器更轻松地解析xml。
以下是一个例子:
int
这将打印第一个rts标签的第一个IP地址,即1.1.1.1/16。
注意: 我需要修复你的xml,最后一个rt标签上有/缺失。