Python正则表达式匹配IPV4地址无效

4 投票
2 回答
3201 浏览
提问于 2025-04-18 13:31

我正在使用 re 这个库。

def validate_ip(self, ip):
    pattern = re.compile(r'([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.{4}')
    matchObj = re.match(pattern, ip)

    if matchObj == None:
        print "Invalid IP:", ip
        sys.exit(0)

当我输入这个IP地址 192.0.0.0 时,输出结果是:

Invalid IP: 192.0.0.0

为什么没有匹配到呢?

2 个回答

2

如果你能使用Python 3.3或更高版本,可以使用ipaddress这个库。

import ipaddress

for ip in ["192.0.0.0", "0.0.0.0", "192.168.0.256"]:
    try:
        ipaddress.ip_address(ip)
        print("{} is valid".format(ip));
    except ValueError:
        print("{} is invalid".format(ip))

输出结果:

192.0.0.0 is valid
0.0.0.0 is valid
192.168.0.256 is invalid
7

你的模式匹配的是一个三位数,后面跟着四个点:

>>> pattern = re.compile(r'([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.{4}')
>>> pattern.match('255....')
<_sre.SRE_Match object at 0x1026eda80>

这里的 {4} 并不是应用于它前面的所有内容;它只适用于 刚刚那个 \.

你需要的是这个:

r'(([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])'

这个匹配你的数字模式加上一个 .3 次,因为现在 {3} 是应用于前面那个括号里的所有内容(使用 (...))。然后你还需要单独匹配最后一组数字。

演示:

>>> pattern = re.compile(r'(([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|2[5][0-5])')
>>> pattern.match('192.0.0.0')
<_sre.SRE_Match object at 0x1023bf588>

顺便说一下,直接用 if not match: 来测试是否匹配失败;在布尔上下文中, None 是一个假值。即使你真的想测试 None,你也应该使用 if match is None:,这样是用身份测试。

撰写回答