我有一些看起来像这样的数据,行数可能会有所不同:
? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20
#etc similar format
我想解析这个问题,以便我可以在表格中打印出这样的内容:
#Protocol Address Age (min) Hardware Addr Type Interface
#Internet 192.168.30.4 - 0010.600a.7026 ARPA Vlan20
#Internet 192.168.30.1 - 70ca.9b99.6a82 ARPA Vlan20
我将数据逐行拆分为两个列表
parse = proc_stdout.split('\n')
这给出了一个包含两个元素的列表:
['? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20', '? (192.168.30.1) a
t 70:ca:9b:99:6a:82 [ether] on vlan20', '']
现在我希望进一步拆分数据,以便在列表的每个空间创建一个新列表。这将产生上面输出的每一行的列表。然后我可以搜索每个列表列表以提取我需要的数据并打印出来。但是你不能拆分列表?最好的方法是什么?
答案 0 :(得分:2)
您可以将list comprehension或generator语句用于此目的:
parse = proc_stdout.strip('\n').split('\n')
parsed_list = [line.split() for line in parse]
或生成器,如果您将结果处理到其他结构
parse = proc_stdout.strip('\n').split('\n')
parsed_list = (line.split() for line in parse)
答案 1 :(得分:1)
您可以在此处使用strs.splitlines
和列表理解:
>>> data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20
... ? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20"""
>>> [line.split() for line in data.splitlines()]
[['?', '(192.168.30.4)', 'at', '00:10:60:0a:70:26', '[ether]', 'on', 'vlan20'],
['?', '(192.168.30.1)', 'at', '70:ca:9b:99:6a:82', '[ether]', 'on', 'vlan20']
]
对于所需的输出,您必须在此处使用字符串格式:
data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20"""
print "#Protocol Address Age (min) Hardware Addr Type Interface"
for line in data.splitlines():
_,ip,_,har_ad,_,_,interface = line.split()
ip = ip.strip('()')
it = iter(har_ad.split(':'))
har_ad = ".".join([x+y for x,y in zip(it,it)])
print "#Internet {} {:>11s} {:>18s} {:>5s} {:>8s}".format(ip,'-', har_ad,'ARPA' ,interface)
<强>输出:强>
#Protocol Address Age (min) Hardware Addr Type Interface
#Internet 192.168.30.4 - 0010.600a.7026 ARPA vlan20
#Internet 192.168.30.1 - 70ca.9b99.6a82 ARPA vlan20