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

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

104
 

要判断一个字符串是否是有效的IPv4地址,我们可以遵循IPv4地址的规则:

  1. IPv4地址由四个用点号分隔的十进制数字组成。

  2. 每个数字必须在0到255之间(包括0和255)。

  3. 第一个数字不能以0开头,除非它是0本身。

以下是一个Python函数,用于判断一个字符串是否是IPv4地址:

def is_valid_ipv4(ip):  
    # 使用正则表达式来匹配IPv4地址的模式  
    pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'  
    if re.match(pattern, ip):  
        # 如果匹配成功,还需要确保没有以0开头的非零数字  
        parts = ip.split('.')  
        for part in parts:  
            if part[0] == '0' and part != '0':  
                return False  
        return True  
    return False  
  
# 导入re模块以使用正则表达式  
import re  
  
# 测试用例  
test_cases = [  
    '192.168.1.1',      # 有效  
    '255.255.255.255',  # 有效  
    '0.0.0.0',          # 有效  
    '256.0.0.1',        # 无效,因为第一个数字超过255  
    '192.168.1.300',    # 无效,因为最后一个数字超过255  
    '192.168.1',        # 无效,因为缺少点号分隔的数字  
    '192.168.01.1',     # 无效,因为第二个数字以0开头  
    '192.168.0.0.1',    # 无效,因为包含五个由点号分隔的数字  
    'a.b.c.d',          # 无效,因为包含非数字字符  
    '',                 # 无效,因为字符串为空  
    None,               # 无效,因为不是字符串  
]  
  
# 运行测试用例  
for case in test_cases:  
    if case is None:  
        print(f'None is not a valid IPv4 address')  
    elif not isinstance(case, str):  
        print(f'{case} (type: {type(case)}) is not a valid IPv4 address (not a string)')  
    else:  
        result = is_valid_ipv4(case)  
        print(f'{case} is a valid IPv4 address: {result}')

请注意,我在正则表达式中使用了非捕获组((?:...)),这样它们就不会在re.match的结果中创建额外的分组。此外,我添加了对空字符串和非字符串类型的检查,以确保测试用例的完整性。

当你运行这个脚本时,它将输出每个测试用例是否是有效的IPv4地址。


更新:2024-06-23 16:15:44 © 著作权归作者所有
QQ
微信