在从xlrd拉取的列表中配对IP地址

问题描述:

我已经使用xlrd从列中拉取数据(Data Below)。我需要将IP地址分组在一起。因此,在输出中出现在一起的IP地址属于同一个池,而单个池在它们自己的池中。例如(10.100.33.183,10.100.33.184)属于(pool1)。 (Pool6 = 10.100.33.89)在从xlrd拉取的列表中配对IP地址

我该如何去实现这一切的帮助欢迎。

[ '', '', '', '', '', '', '', '池成员IP', '','10 .100.33.184(S56723FR6VL01)”,'10 .100.33.183 (S56723FR6VL03)','10 .100.33.181(S56723FR6VL04)','''','','','','','','','10 .101.33.182(S56723FR6VL02) '','','','','','10 .100.33.180(S56723FR6VL05)','10 .100.33.179(S56723FR6VL06)','','','','','','' ,'10 .100.33.178(S56723FR6VL07)','10 .100.33.177(S56723FR6VL08)','','','','','','','','10 .100.33.90(S56723FR6VL09) ','','','','','','','','','10 .100.33.89(S56723FR6VL0A)','','','','','',' '','','','10 .100.33.91(S56723FR6VW01)','','','','','','','','','','','' ,'','','','','','','','','','','','','','','','','' ','']

+0

你应该这样做,因为从Excel中提取数据的一部分。 –

+0

做出以下假设:1:在获取xlrd响应时,您无法按池合并地址。 3:没有池的单个地址先于空字符串并被其取代。 4:地址不要在响应中重复。这些假设是否正确? – BoboDarph

ip_data = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
ip_pools = [[]] # it starts as a list with an empty list at its last (and only) index 
for ip_address in ip_data[ip_data.index('Pool Member IP')+1:]: 
    if not ip_address: # ip_address is '' 
     if ip_pools[-1]: # the last element of ip_pools is NOT an empty list: [] 
      ip_pools.append([]) # for the next ip pool 
    else: # ip_address is not empty 
     # ip_pools[-1].append(ip_address) # if you need the whole text 
     ip_pools[-1].append(ip_address.partition(' ')[0]) # if you just want the number 
if [] in ip_pools: 
    ip_pools.remove([]) # to remove last empty list (if exists) 

编辑:更正了句子

+0

谢谢,这非常有帮助,也很快。我花了两天的时间无处不在! – degixer

+0

答案不再正确吗? –

+0

它仍然是... – degixer

@ franciscosollima的解决方案是好的。这是另外一种正则表达式。

iplist = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 

import re 

p = re.compile('[\d]+(?:\.[\d]+){3}') 

pools = [[]] 

for ip in iplist: 
    m = p.match(ip) 
    if m: 
     pools[-1].append(m.group(0)) 
    elif not pools[-1]: 
     continue 
    else: 
     pools.append([]) 

if [] in pools: 
    pools.remove([]) 

for i, p in enumerate(pools, 1): 
    print("Group " + str(i) +": " + str(p)) 

这就像向同一个池中添加连续匹配一样简单。否则,请初始化一个新的。正则表达式模式将从一开始就匹配,您也可以配置它检测IPv6地址。

打印出:

Group 1: ['10.100.33.184', '10.100.33.183'] 
Group 2: ['10.101.33.182', '10.100.33.181'] 
Group 3: ['10.100.33.180', '10.100.33.179'] 
Group 4: ['10.100.33.178', '10.100.33.177'] 
Group 5: ['10.100.33.90'] 
Group 6: ['10.100.33.89'] 
Group 7: ['10.100.33.91'] 
+0

伟大的解决方案,很干净,我喜欢它。感谢coldspeed – degixer

ips = [ip.split()[0] for ip in data if ip[0].isdigit()] 
sort = sorted(ips, key= lambda ip: int(ip.split('.')[-1])) 
i, l, c = 0, len(sort), 1 
pools = {} 
while i < l: 
    if int(sort[i].split('.')[-1]) == int(sort[i+1]).split('.')[-1])-1: 
     pools[c] = (sort[i], sort[i+1]) 
     i += 2 
    else: 
     pools[c] = (sort[i],) 
     i += 1 
    c += 1 

我可以打几分与itertools一个答案?

test = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
import itertools 
def isplit(iterable,splitters): 
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k] 
test.remove('Pool Member IP') 
pool = 0 
for list in isplit(test,''): 
    if len(list): 
     pool+=1 
    print(pool, list) 

打印出:

1 ['10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)'] 
2 ['10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)'] 
3 ['10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)'] 
4 ['10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)'] 
5 ['10.100.33.90 (S56723FR6VL09)'] 
6 ['10.100.33.89 (S56723FR6VL0A)'] 
7 ['10.100.33.91 (S56723FR6VW01)'] 

荣誉给Split a list into nested lists on a value和google福

+0

感谢BoboDarph我只是给了这个链接一看 – degixer

+0

基本上我所做的一切就是找到一种方法来将列表拆分成基于列表项的子列表在你的情况下是空元素 - ''),然后增加一个计数器并打印每个非空子列表的子列表。并从列表中弹出所有不需要的东西(在你的情况下是'Pool member IP'字符串)。 – BoboDarph