题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
# coding=utf-8
# 存在一个bug,就是127和0开头的它需要放在合法校验之前检查,否则非法记数会可能比多记
# lst = [A, B, C, D, E, 错误的, 私有IP]lst = [0, 0, 0, 0, 0, 0, 0]
import re
val_lst = []
while True:
try:
in_str = raw_input().split('~')
ip = in_str[0]
mask = in_str[1]
# 解析初步合法后,再确认IP是否属于0.*.*.*和127.*.*.*
if ip.startswith('0.') or ip.startswith('127.'):
# 忽略,不计数
continue
# 解析ip地址是否合法
res = re.findall('^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$', ip)
if not res:
# print 1111111111111111111
lst[5] +=1
val_lst.append(in_str)
continue
# 存在大于255的,非法+1
ip_fd_lst = map(int, ip.split('.'))
ip_fd_lst_1 = [i for i in ip_fd_lst if i > 255]
if len(ip_fd_lst_1) >= 1:
# print 22222222222222222222
val_lst.append(in_str)
lst[5] +=1
continue
# 解析子网掩码是否合法
res = re.findall('^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$', mask)
if not res:
# print 3333333333333333333
val_lst.append(in_str)
lst[5] +=1
continue
mask_fd_lst = map(int, mask.split('.'))
mask_fd_lst_1 = [i for i in mask_fd_lst if i > 255]
if len(mask_fd_lst_1) >= 1:
# print 4444444444444444444
val_lst.append(in_str)
lst[5] +=1
continue
# print 'mask_fd_lst: ', mask_fd_lst
mask_to_bin = [bin(i).replace('0b', '').zfill(8) for i in mask_fd_lst]
mask_bin_str = ''.join(mask_to_bin)
# 全0和全1
if mask_bin_str.count('1') == 32 or mask_bin_str.count('0') == 32:
# print 55555555555555555555555
val_lst.append(in_str)
lst[5] +=1
continue
# 最高位为0
if mask_bin_str[0] == 0:
# print 66666666666666666666
val_lst.append(in_str)
lst[5] +=1
continue
idx = 0
is_1 = True
flag = True
for i in mask_bin_str:
if i != '1' and is_1:
is_1 = False
if not is_1:
if i == '1':
# print mask_bin_str
flag = False
break
if not flag:
# print 7777777777777777777
val_lst.append(in_str)
lst[5] +=1
continue
# 解析是否为A类,若是,检查是否为10私网IP
ip_head = ip_fd_lst[0]
if 1 <= ip_head <= 126:
lst[0] += 1
if ip_head == 10:
lst[6] += 1
continue
# 解析是否为B类,若是,检查是否为172的私网IP
if 128 <= ip_head <= 191:
lst[1] += 1
if ip_head == 172:
ip_second = ip_fd_lst[1]
if 16 <= ip_second <= 31:
lst[6] += 1
continue
# 解析是否为C类,若是,检查是否为192网段
if 192 <= ip_head <= 223:
lst[2] += 1
if ip_head == 192:
ip_second = ip_fd_lst[1]
if ip_second == 168:
lst[6] += 1
continue
# 解析是否为D类
if 224 <= ip_head <= 239:
lst[3] += 1
# 解析是否为E类
if 240 <= ip_head <= 255:
lst[4] += 1
except BaseException as e:
# print e
break
print ' '.join(map(str,lst))
# print val_lst