首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配IPV4地址的Python正则表达式不起作用

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

Stack Overflow用户
提问于 2014-07-16 10:52:03
回答 2查看 3K关注 0票数 4

我正在使用re库。

代码语言:javascript
复制
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时,输出是:

代码语言:javascript
复制
Invalid IP: 192.0.0.0

为什么不匹配?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-16 10:54:41

您的模式匹配一个3位数的数字,后面紧跟着4个点:

代码语言:javascript
复制
>>> 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}并不适用于它之前的所有东西;它只适用于\.

你想要的是:

代码语言:javascript
复制
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}应用于前面分组表达式中的所有内容(使用(...))。然后,您仍然需要分别匹配最后一个数字组。

演示:

代码语言:javascript
复制
>>> 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:,使用身份测试。

票数 7
EN

Stack Overflow用户

发布于 2014-07-16 11:06:28

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

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
192.0.0.0 is valid
0.0.0.0 is valid
192.168.0.256 is invalid
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24778954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档