Python:将非特定格式的字符串转换为字典?

时间:2016-01-30 00:28:01

标签: python dictionary

我正在抓取路由器的连接设备页面,以获取谁的家的列表。如果我设置一个简短的DHCP版本,我可以通过不同的方法很容易地做到这一点。但是,我希望能够将以下字符串转换为字典,以便以更优化的方式完成此操作:

wldev = [['eth1','8C:3A:E3:95:77:21',-85,54000,1000,31365,0],
['eth1','A4:77:33:0C:E0:BE',-41,72223,72223,42239,0],
['eth2','58:B0:35:7A:20:C1',-34,104000,130000,21017,1],
['eth2','A4:77:33:66:BC:F6',-48,39000,58500,43956,1]]

实际上这一切都出现在一条线上。我能得到的最接近的是使用:

制作元组
wldev = wldev.replace(']','}')
wldev = wldev.replace('eth0\''',', 'eth0\': {').replace('eth1\''',', 'eth1\': {').replace('eth2\''',', 'eth2\': {').replace('br0\''',', 'br0\': {').replace('br1\''',', 'br\': {')
wldev = wldev.replace('0}', '0\'}}').replace('1}', '1\'}}').replace(',','\',\'').replace('\'\'','\'').replace('\',\'{',',{')

但这很难看。我是Python的新手,对RegEx知之甚少,但肯定有一个更简单的方法。可能是简单的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

使用ast.literal_eval()

  

安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None。

from ast import literal_eval

print(literal_eval(wldev))

演示:

>>> from ast import literal_eval
>>> 
>>> wldev = """[['eth1','8C:3A:E3:95:77:21',-85,54000,1000,31365,0],
... ['eth1','A4:77:33:0C:E0:BE',-41,72223,72223,42239,0],
... ['eth2','58:B0:35:7A:20:C1',-34,104000,130000,21017,1],
... ['eth2','A4:77:33:66:BC:F6',-48,39000,58500,43956,1]]"""
>>> 
>>> literal_eval(wldev)
[['eth1', '8C:3A:E3:95:77:21', -85, 54000, 1000, 31365, 0], ['eth1', 'A4:77:33:0C:E0:BE', -41, 72223, 72223, 42239, 0], ['eth2', '58:B0:35:7A:20:C1', -34, 104000, 130000, 21017, 1], ['eth2', 'A4:77:33:66:BC:F6', -48, 39000, 58500, 43956, 1]]

结果,您获得了打印列表的Python列表。要从中制作字典,并且由于子列表中存在非唯一的第一项,我会使用collections.defaultdict()

from collections import defaultdict

l = literal_eval(wldev)

d = defaultdict(list)
for item in l:
    d[item[0]].append(item[1:])