将从xlrd中提取的列表中的IP地址配对

问题描述 投票:0回答:4

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

我如何实现这一切所有帮助欢迎。

['','','','','','','','池成员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)','','','','','','','','','','','','',''' ,'','','','','','','','','','','','','','','','','

python list keyvaluepair
4个回答
1
投票
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)

编辑:纠正了句子


1
投票

@ 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']

1
投票
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

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-fu

© www.soinside.com 2019 - 2024. All rights reserved.