匹配IPV4地址的Python正则表达式不';行不通

匹配IPV4地址的Python正则表达式不';行不通,python,regex,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) import ipaddress for i

我正在使用
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)
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))
当我通过IP192.0.0.0时,输出为:

Invalid IP: 192.0.0.0

为什么不匹配?

您的图案与一个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>
这将与数字模式加上一个点匹配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')

另外,如果不匹配,只需使用
测试匹配失败<代码>无在布尔上下文中为假值。即使您真的想测试
None
,如果匹配为None,您也应该使用
,使用身份测试。

如果您可以使用Python 3.3+,请使用该库

输出:

192.0.0.0 is valid
0.0.0.0 is valid
192.168.0.256 is invalid

请注意,此表达式不匹配所有有效的IPv4地址。它遗漏了例如
192.168.0.01
192.168.1
,这两个词都是
192.168.0.1
@SvenMarnach的有效同义词:
192.168.0.01
实际上是匹配的。
[01]?[0-9]?[0-9]
部分最多允许两个前导零。为什么要使用正则表达式?Python附带了@Tichodroma:但仅从Python 3.3开始。从外观上看,OP使用的是Python 2。@MartijnPieters True,
print
就是一个标志。
ipaddress
在Python 3.3中是新的;根据
print
语句判断,OP使用的是Python 2。
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