test_numb3rs.py 捕获 numb3rs.py 仅检查 IPv4 地址的第一个字节是否在预期退出代码 1 范围内,而不是 0

问题描述 投票:0回答:1

这是numb3rs.py的代码

import re

def main():
    print(validate(str(input("IPv4 Address: "))))

def validate(ip):
    return bool(re.match(r"^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.)){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$", ip))

if __name__ == "__main__":
    main()

这是test_numb3rs.py的代码

from numb3rs import validate

def test_max_min():
    assert(validate("1.1.1.1")) == True
    assert(validate("255.255.255.255")) == True
def test_alpha():
    assert(validate("abc")) == False
def test_incorrect_limit():
    assert(validate("1000.1000.266.1000")) == False
    assert(validate("05.1c2.02.04")) == False
    assert(validate("5.1111.1.1")) == False
    assert(validate("1.1.1.1.1")) == False
    assert(validate("1.1.1..")) == False
    assert(validate("1.1000.1.1")) == False
    assert(validate("1000.1.1.1")) == False

任何帮助将非常感激

我尝试添加测试,但仍然导致错误

python cs50
1个回答
0
投票

考虑使用

re.compile
validate
函数之外定义一个常量,这样就不需要在每次调用它时都进行编译。

此外,您可以为 IPV4 地址的单个有效八位字节定义模式并将其乘以四:

import re

IPV4_OCTET_PATTERN = r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
IPV4_PATTERN = re.compile(r'^' + r'\.'.join([IPV4_OCTET_PATTERN] * 4) + r'$')

def main():
    ip_address = input('IPv4 Address: ')
    print(validate(ip_address))

def validate(ip_address: str) -> bool:
    """Validates an IPv4 address."""
    return True if IPV4_PATTERN.match(ip_address) else False

if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.