用于匹配IPV4地址的Python正则表达式不起作用

时间:2014-07-16 10:52:04

标签: python regex

我正在使用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 个答案:

答案 0 :(得分:7)

您的模式匹配一​​个3位数字,后面恰好是4个点:

>>> 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是布尔上下文中的false值。即使您真的想要测试None,也应该使用if match is None:,使用身份测试。

答案 1 :(得分:1)

如果您可以使用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