python正则表达式(re.search)ipv4地址格式

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

我是Python新手。我正在网上做CS50P。

问题要求我们验证 IPv4 格式的 IP 地址。

我的代码是:


def main():
    ip = input("IPv4 Address: ")

    if validate(ip):
        print(validate(ip))
    else:
        print(validate(ip))

def validate(ip):
    pattern = r"^(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-5][0-5]?)\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-5][0-5]?)\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-5][0-5]?)\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-5][0-5]?)$"
    match = re.search(pattern, ip)
    if match:
        return True
    else:
        return False

if __name__ == "__main__":
    main()`

我的问题是:我不明白为什么 140.247.235.144 会返回 False?

我后来修改为


def main():
    ip = input("IPv4 Address: ")

    if validate(ip):
        print(validate(ip))
    else:
        print(validate(ip))

def validate(ip):
    pattern = r"^(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5])$"
    match = re.search(pattern, ip)
    if match:
        return True
    else:
        return False

if __name__ == "__main__":
    main()

现在效果很好。有人可以解释一下吗?另外,如何通过仅允许 REGEX 的约束来收紧它?

谢谢!

python python-regex
1个回答
0
投票

它不接受范围246-249,因为2[0-5][0-5]?这个表达式不允许。从[0-5]开始?条件不满足大于5的值,140.247.235.144不接受这里的表达式247。

您可以按如下方式防止重复第二个陈述。由于前三部分是重复的,因此您可以将它们分组。

^((0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5]) .){3}(0|[1-9][0-9]?|1[0-9][0-9]?|2[0-4][0-9]|25[0-5 ])$

© www.soinside.com 2019 - 2024. All rights reserved.