查找并将子网掩码转换为列表中的CIDR

时间:2018-03-22 19:27:11

标签: python python-2.7

我有一个包含以下格式的数百个IP地址和掩码的列表:

['10.10.10.0/255.255.255.0', '10.10.20.0/255.255.255.192']

我想将此列表转换为以下格式:

['10.10.10.0/24', '10.10.20.0/26']

这是我的代码:

# List already containing all ip/mask (format: 10.10.10.0/255.255.255.0') shown above
print ip_mask_list
#hardcoded mask for testing
netmask = "255.255.248.0"
#convert mask to CIDR
cidr = sum([bin(int(x)).count('1') for x in netmask.split('.')])
print cidr  # prints 21

我可以将掩码转换为CIDR,但是我怎么做呢,而不是传递硬编码的网络掩码变量,我可以传递ip_mask_list并通过所有掩码并转换为CIDR,如上所示。也许创建下一个列表,其中所有255.x.x.x都转换为/xx

由于

戴蒙

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

import re
s = ['10.10.10.0/255.255.255.0', '10.10.20.0/255.255.255.192']
final_ips = ['{}/{}'.format(a, sum([bin(int(x)).count('1') for x in b.split('.')])) for a, b in map(lambda x:re.findall('[\d\.]+', x), s)]

输出:

['10.10.10.0/24', '10.10.20.0/26']

答案 1 :(得分:0)

这个在IP和掩码部分中分割原始IP地址。 IP地址与以前一样使用,而cidr_suffix是根据ip_mask中的设置位数计算的。

ips = ['10.10.10.0/255.255.255.0', '10.10.20.0/255.255.255.192']

def append_cidr_suffix(full_ip):
    address_and_mask = full_ip.split('/')
    prefix = address_and_mask[0]
    ip_mask = address_and_mask[1]

    suffix = sum(bin(int(sub_part)).count('1') for sub_part in ip_mask.split('.'))   

    return prefix + '/' + str(suffix)

cidr_ips = [append_cidr_suffix(i) for i in ips]