题解 | #识别有效的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

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务