python3判断ip地址是否有效

描述

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址从1.0.0.0到126.255.255.255;

B类地址从128.0.0.0到191.255.255.255;

C类地址从192.0.0.0到223.255.255.255;

D类地址从224.0.0.0到239.255.255.255;

E类地址从240.0.0.0到255.255.255.255

私网IP范围是:

从10.0.0.0到10.255.255.255

从172.16.0.0到172.31.255.255

从192.168.0.0到192.168.255.255

子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
(注意二进制下全是1或者全是0均为非法子网掩码)

注意:

  1. 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  2. 私有IP地址和A,B,C,D,E类地址是不冲突的

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。

请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

示例1

输入:
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19…0.~255.255.255.0
复制
输出:
1 0 1 0 0 2 1

"""
10_识别有效IP地址 - 

Author: hanayo
Date: 2024/3/21
"""

# ABCDE 无效,私人地址
ip_dict = {
    "A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "Error": 0, "Private": 0
}


def get_bit(ip, n):
    """从ip中获得第几位"""
    bit_list = ip.split(".")
    bit = int(bit_list[n])
    return bit


def check_ip(ip: str):
    bit_list = ip.split(".")
    if len(bit_list) != 4:
        return False
    for bit in bit_list:
        try:
            bit = int(bit)
            if bit > 255 or bit < 0:
                return False
        except ValueError:
            return False
    return True


def check_type(ip: str):
    bit1 = get_bit(ip, 0)
    if bit1 == 0:
        return None
    elif bit1 <= 126:
        return "A"
    elif bit1 == 127:
        return None
    elif bit1 <= 191:
        return "B"
    elif bit1 <= 223:
        return "C"
    elif bit1 <= 239:
        return "D"
    else:
        return "E"


def check_private(ip: str):
    bit1 = get_bit(ip, 0)
    if bit1 == 10:
        return True
    bit2 = get_bit(ip, 1)
    if bit1 == 172 and 16 <= bit2 <= 31:
        return True
    if bit1 == 192 and bit2 == 168:
        return True
    return False


def check_mask(mask: str):
    if not check_ip(mask):
        return False
    if mask in {"0.0.0.0", "255.255.255.255"}:
        return False
    bit_list = mask.split(".")
    res = ""
    for bit in bit_list:
        bit_num = bin(int(bit))[2:]
        res += str(bit_num.zfill(8))
    # 从左往右,找第一个0
    zero_i = res.find("0")
    # 从右往左,找第一个1
    one_i = res.rfind("1")
    if zero_i - one_i == 1:
        return True
    else:
        return False


def main():
    while True:
        ip, mask = str(input()).split("~")
        bit1 = get_bit(ip, 0)
        # 这一步一定要有,否则本该跳过的,会计入错误地址中
        if bit1 == 127 or bit1 == 0:
            continue
        if check_ip(ip) and check_mask(mask):
            ip_type = check_type(ip)
            if ip_type:
                ip_dict[ip_type] += 1
            if check_private(ip):
                ip_dict['Private'] += 1
        else:
            ip_dict['Error'] += 1


if __name__ == '__main__':
    try:
        main()
    except (EOFError, ValueError):
        pass
    for key in ip_dict.keys():
        print(ip_dict[key], end=" ")

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用正则表达式判断一个字符串是否IP地址,你可以使用Python的re模块和合适的正则表达式。以下是一个示例: ```python import re def is_valid_ip(ip_address): # 定义IP地址的正则表达式 ip_regex = r'^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$' # 使用正则表达式进行匹配 match = re.match(ip_regex, ip_address) if match: return True # 是有效IP地址 else: return False # 不是有效IP地址 # 测试字符串 ip1 = '192.168.0.1' ip2 = '10.0.0.1' ip3 = '172.16.0.1' ip4 = '8.8.8.8' invalid_ip = '256.0.0.1' print(is_valid_ip(ip1)) # 输出:True print(is_valid_ip(ip2)) # 输出:True print(is_valid_ip(ip3)) # 输出:True print(is_valid_ip(ip4)) # 输出:True print(is_valid_ip(invalid_ip)) # 输出:False ``` 在这个示例中,我们定义了一个名为`is_valid_ip`的函数,该函数接受一个字符串作为输入,并使用正则表达式来判断该字符串是否符合IP地址的格式。如果匹配成功,则返回True,否则返回False。 正则表达式`^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$`用于匹配合法的IP地址格式。它可以匹配四个由点分隔的数字段,每个数字段的取值范围是0到255。如果字符串符合这个正则表达式,则被判断有效IP地址。 在上面的示例中,我们测试了几个字符串,其中前四个是有效IP地址,最后一个是无效的IP地址。根据正则表达式的匹配结果,输出结果表明前四个字符串被判断有效IP地址,最后一个字符串被判断为无效的IP地址

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值