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

Man*_*ent 3 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)
Run Code Online (Sandbox Code Playgroud)

当我通过IP 192.0.0.0时,输出是:

Invalid IP: 192.0.0.0
Run Code Online (Sandbox Code Playgroud)

为什么不匹配?

Mar*_*ers 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>
Run Code Online (Sandbox Code Playgroud)

{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])'
Run Code Online (Sandbox Code Playgroud)

这与您的数字模式加上一个.点匹配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>
Run Code Online (Sandbox Code Playgroud)

顺便说if not match:一句,只是用来测试匹配失败; None是布尔上下文中的false值.即使你真的想要测试None,你也应该if match is None:使用身份测试.