• 面试题-给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例


    前言

    给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例

    判断是不是ipv4地址

    先要知道 ipv4 地址的格式:(1~255).(0~255).(0~255).(0~255)

    从格式上看有3个点,分四个部分,第1部分范围是1~255, 后面3个部分是0~255
    于是可以把字符串按.去切割,判断数字范围大小

    '''
    给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    '''
    
    
    def check_ipv4(ip_str):
        """检查ipv4地址格式"""
        if not isinstance(ip_str, str):
            print("输入参数不合法,请输入字符串")
            return False
        if ip_str.count(".") != 3:
            return False
        else:
            ip_list = ip_str.split(".")
            print(ip_list)   # 按点切割四个部分
            # 校验每个部分的合法性,判断是不是数字
            num1 = ip_list[0]
            try:
                n1 = int(num1)
                print("第1个数字:", n1)
                if n1 >=1 and n1 <= 255:
                    pass
                else:
                    return False
            except:
                return False
            # 后面3个数字
            for n in ip_list[1:]:
                try:
                    n2 = int(n)
                    print("后面数字:", n2)
                    if n2 >=0 and n2 <= 255:
                        pass
                    else:
                        return False
                except:
                    return False
            return True
    
    if __name__ == '__main__':
        result = check_ipv4("1.2.2.3")
        print(result)
    
    

    正则判断ipv4地址

    也可以用正则表达式判断ipv4地址, 正则匹配代码会简单很多
    先第一部分匹配1-255, 匹配有5种情况

    • 1位数 1-9
    • 2位数 10-99
    • 3位数 100-199
    • 3位数 200-249
    • 3位数 250-255

    于是正则表达式可以写成[1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]
    后面3个数是从0-255,根上面的差不多,把1-9 改成 0-9 即可

    import re
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    def check_ipv4_by_re(ip_str):
        """正则判断ipv4"""
        if not isinstance(ip_str, str):
            print("输入参数不合法,请输入字符串")
            return False
        compile_ipv4 = re.compile('^([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))(\.([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))){3}$')
        if compile_ipv4.match(ip_str):
            return True
        else:
            return False
    
    if __name__ == '__main__':
        result2 = check_ipv4_by_re("255.0.2.3")
        print(result2)
    

    测试用例

    什么是有效的ipv4地址?(baidu搜来的)

    有效ipV4(第4版)地址的范围是1.0.0.0~254.255.255.254,由4节组成,每节取值范围0~255
    但有一些地址是特殊的,不能算bai作”有效值“有效IP地址的范围是:网络地址+1~广播地址-1。
    有效IP地址分为3类,分别是:
    A类IP段 0.0.0.0 到127.255.255.255 (0段和127段不使用)。
    B类IP段 128.0.0.0 到191.255.255.255
    C类IP段 192.0.0.0 到223.255.255.255

    如果仅仅是校验ipv4 地址的格式:(1~255).(0~255).(0~255).(0~255),用上面的代码就行了,如果要校验有效IP,还得排除掉无效的ip

    测试用例设计

    测试点 用户输入 期望结果
    非字符串 1234 输入不合法 False
    空字符 "" False
    格式不对 abcdef False
    格式不对 123.456 False
    格式不对 1.2.3 False
    第1位校验 a.1.1.1 False
    - 0.1.1.1 False
    - 1.1.1.1 True
    - 9.1.1.1 True
    - 10.1.1.1 True
    - 99.1.1.1 True
    - 100.1.1.1 True
    - 199.1.1.1 True
    - 200.1.1.1 True
    - 250.1.1.1 True
    - 255.1.1.1 True
    - 256.1.1.1 False
    - 356.1.1.1 False
    第2位校验 10.a.1.1 False
    - 10.0.1.1 True
    - 10.255.1.1 True
    - 10.256.1.1 False
    - 10.300.1.1 False
    第3位校验 10.0.a.1 False
    - 10.0.0.1 True
    - 10.0.255.1 True
    - 10.0.256.1 False
    - 10.0.300.1 False
    第4位校验 10.0.0.a False
    - 10.0.0.0 True
    - 10.0.0.255 True
    - 10.0.0.256 False
    - 10.0.0.300 False

    代码测试用例

    用pytest框架测试上面的用例

    import pytest
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    # 测试数据
    test_data = [
        [1234, False],
        ["", False],
        ["abcdef", False],
        ["123.456", False],
        ["1.2.3",  False],
        ["a.1.1.1", False],
        ["0.1.1.1", False],
        ["1.1.1.1", True],
        ["9.1.1.1", True]
    
    ]
    
    
    @pytest.mark.parametrize("test_input, expected", test_data)
    def test_ip(test_input, expected):
        assert expected == check_ipv4_by_re(test_input)
    

    用例太多,省略了一部分

  • 相关阅读:
    jQuery.API源码深入剖析以及应用实现(4) - 选择器篇(下)
    jquery表单应用
    随笔 没顾虑
    jquery基础技巧总结
    jQuery.API源码深入剖析以及应用实现(3) - 选择器篇(上)
    JQuery语法总结和注意事项
    5个jQuery问题和解答
    Jquery编辑数据
    jquery 对checkbox的操作
    有关jQuery动画的认识
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14370281.html
Copyright © 2020-2023  润新知