如何:python字符串解析与空格,除了单词之间的单个空格?

时间:2016-04-15 17:54:06

标签: python string iptables

一直致力于解析iptables输出,以获取每个源IP使用python的统计信息。不想包含iptc模块。 所以只是做字符串操作。

bytes target     prot opt in     out     source               destination         
        0     0            udp  --  *      eth1    10.10.10.10          0.0.0.0/0           udp spt:10 
        0     0            tcp  --  *      eth1    10.10.10.10          0.0.0.0/0           tcp spt:10 
        0     0            all  --  *      eth1    1.1.1.1              0.0.0.0/0           
        0     0            all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           source IP range 5.5.5.5-5.5.5.10 
        0     0            all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           source IP range 4.4.4.4-4.4.4.5 
        0     0            all  --  *      eth1    0.0.0.0/0            0.0.0.0/0          

>>> s='    0     0            udp  --  *      eth1    10.10.10.10          0.0.0.0/0           udp spt:10 '
>>> s.split()
['0', '0', 'udp', '--', '*', 'eth1', '10.10.10.10', '0.0.0.0/0', 'udp', 'spt:10']

想要解析如下,如何分隔除单词之间的单个空格之外的所有空格?

expected_output=['0', '0', 'udp', '--', '*', 'eth1', '10.10.10.10', '0.0.0.0/0', 'udp spt:10']

OR是否有更好的从iptables获取统计数据,但没有iptc?

1 个答案:

答案 0 :(得分:1)

不能保证iptables输出的所有列都会被多个空格分隔。它只是保证至少有一个空间。以下是该命令输出的片段(当在我的一台机器上运行时),你可以看到发生这种情况:

 $> iptables -nvL
 ...
     0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
 ...

幸运的是,前9列中的值不会有任何空格。因此,您可以为每一行执行以下操作,以便以您希望的方式获取数据:

fs = s.split()
if len(fs) > 9:
     fs[9] = " ".join(fs[9:])
     fs = fs[:10]