我正在编写一个从DHCP数据包中提取数据的Python脚本。目前,我输出的一部分只是来自DHCP选项的列表:
[('message-type',3),('param_req_list',b'\ x01y \ x01 \ x01 \ x011 \ aaa _,。'),('max_dhcp_size',1500),('client_id',b '\ x01(\ aaa \ aa1A \ aa1O'),('requested_addr','192.168.1.4'),('server_id','192.168.1.1'),('hostname',b'HOSTNAME')]
我只想要打印消息类型,主机名和请求的地址。我从哪里开始将它转换为元组,所以我可以过滤掉元素?
编辑: 我的输出在上面。 我的代码是:
sslmode = require
答案 0 :(得分:1)
假设要解析的字符串看起来(并且看起来像)有效的python数据严格,你可以用python
的内部工具解析它
from ast import literal_eval
lst = literal_eval(msg)
data = dict(lst)
...
literal_eval将字符串解析为python数据结构(并且它更安全eval
)。 dict
从中构建方便的字典。
答案 1 :(得分:0)
#At this point it is not clear to me if this exec is needed.
exec("vals = [('message-type', 3), ('param_req_list', b'\x01y\x01\x01\x011\aaa_,.'), ('max_dhcp_size', 1500), ('client_id', b'\x01(\aaa\aa1A\aa1O'), ('requested_addr', '192.168.1.4'), ('server_id', '192.168.1.1'), ('hostname', b'HOSTNAME')]")
ans = []
for v in vals:
if v[0] in ['message-type', 'hostname', 'requested_addr']:
ans += (v,)
print (ans)
答案 2 :(得分:0)
也许,它不是过滤的最佳解决方案,但它确实有效。下面的代码将您的列表转换为字典(直接,感谢@Slam提醒)并获取字典值。
>>> x=[('message-type', 3), ('param_req_list', b'\x01y\x01\x01\x011\aaa_,.'), ('max_dhcp_size', 1500), ('client_id', b'\x01(\aaa\aa1A\aa1O'), ('requested_addr', '192.168.1.4'), ('server_id', '192.168.1.1'), ('hostname', b'HOSTNAME')]
>>> y=dict(x)
>>> y['requested_addr']
'192.168.1.4'
>>> y['hostname']
'HOSTNAME'
>>>
这段代码根本不是最优的,但可能会给你一些想法。