我想使用 python 中的正则表达式从下面的 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','类型',路由]]
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”?
最佳答案
使用 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 标签上缺少/。
关于python - 正则表达式将字符串分割成相同的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40298671/