我有一个包含以下格式的数百个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
。
由于
戴蒙
答案 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]