使用正则表达式在python中验证IP地址[重复]

Posted

技术标签:

【中文标题】使用正则表达式在python中验证IP地址[重复]【英文标题】:ip address validation in python using regex [duplicate] 【发布时间】:2012-04-22 14:45:25 【问题描述】:

在下面的 ip 地址验证中,我想看看它是否是一个有效的 ip 地址,我该如何使用下面的 re

>>> ip="241.1.1.112343434" 
>>> aa=re.match(r"\d1,3\.\d1,3\.\d1,3\.\d1,3[^0-9]",ip)
>>> aa.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

【问题讨论】:

正则表达式是检查 IP 地址的糟糕方法。您必须匹配最多 255 的数字,但不是 256,因此正确执行此操作的正则表达式相当大 【参考方案1】:

为什么不使用库函数来验证 IP 地址?

>>> ip="241.1.1.112343434" 
>>> socket.inet_aton(ip)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.error: illegal IP address string passed to inet_aton

【讨论】:

这里只有一件事。如果您使用这种方法 1 也将是根据手册页合适的 IP 地址。 @Phoenix,是的,1 等同于 0.0.0.1(应该如此)。这就是为什么您应该更喜欢专门的库函数而不是 regex hack。 这是 IMO 的最佳方法。正则表达式黑客总是容易出错,并且使用内置进行此类验证应该是首选。 旧答案但仍然相关,我认为这不是一个完美的方法,考虑到 OP 需要确保原始字符串需要采用 XXX.XXX.XXX 形式的用例。 XXXXX。使用 socket.inet_aton 将允许 ip 为“1”,正如上面@JohnLaRooy 所提到的,它确实是一个有效的 IP 地址,但在字符串必须包含 4 个八位字节和一个端口的情况下它可能无效(这是未指定的要求由 OP)。在这种情况下,我会考虑结合使用 socket.inet_aton 和正则表达式方法【参考方案2】:

改用锚点:

aa=re.match(r"^\d1,3\.\d1,3\.\d1,3\.\d1,3$",ip)

这些确保字符串的开头和结尾在正则表达式的开头和结尾匹配。 (嗯,从技术上讲,您不需要起始 ^ 锚点,因为它隐含在 .match() 方法中)。

然后,在尝试访问其结果之前检查正则表达式是否确实匹配:

if aa:
    ip = aa.group()

当然,这不是验证 IP 地址的好方法(查看 gnibbler 的答案以了解正确的方法)。但是,正则表达式可用于检测较大字符串中的 IP 地址:

ip_candidates = re.findall(r"\b\d1,3\.\d1,3\.\d1,3\.\d1,3\b", ip)

这里,\b 单词边界锚确保每个段的数字不超过 3。

【讨论】:

在超出 IP 地址范围的111.111.111.345 上会失败。 import re def is_valid_ip(ip): ipv = re.match(r"^(\d1,3)\.(\d1,3)\.(\d 1,3)\.(\d1,3)$",ip) 返回 bool(ipv) 和 all(map(lambda n: 0 【参考方案3】:

\d1,3 将匹配像 00333 这样的数字,它们不是有效的 ID。

This 是 smink 的一个很好的回答,引用:

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]2|2[0-4][0-9]|25[0-5])\.)3([0-9]|[1-9][0-9]|1[0-9]2|2[0-4][0-9]|25[0-5])$";

【讨论】:

这无法验证 0.0.0.0【参考方案4】:
try:
    parts = ip.split('.')
    return len(parts) == 4 and all(0 <= int(part) < 256 for part in parts)
except ValueError:
    return False # one of the 'parts' not convertible to integer
except (AttributeError, TypeError):
    return False # `ip` isn't even a string

【讨论】:

这对我来说更好。谢谢。 如果您要进行更严格的验证,我会替换 return len(parts) == 4 and all(0 &lt; len(part) &lt; 4 and 0 &lt;= int(part) &lt; 256 for part in parts) 的验证,以防我们遇到这样的字符串:1.1.00000000003.1 @LuissRicardo 在什么情况下,IP 地址会是这样的?甚至以那种格式返回? 关键是要确保我们没有得到不是 IP 地址的东西。【参考方案5】:

下面会检查一个IP是否有效:如果IP在0.0.0.0到255.255.255.255之间,则输出为真,否则为假:

[0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4

示例:

your_ip = "10.10.10.10"
[0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4

输出:

>>> your_ip = "10.10.10.10"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
True
>>> your_ip = "10.10.10.256"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
False
>>>

【讨论】:

你真的运行这段代码来显示输出吗?我怀疑your-ip 是一个无效的变量名。我还看到这个答案是最近才提出的,但其他答案更具可读性。 这是一个拼写错误,应该用 '_' 代替。是的,已经运行了代码并得到了正确的输出。如果有任何问题,请告诉我 重点是 - 发布的一段代码有错字,无法执行但显示输出。如果您想显示输出,请确保发布与执行的代码相同的代码,而不是其他任何内容。 yes 发布执行的代码。感谢您指出。

以上是关于使用正则表达式在python中验证IP地址[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中使用正则表达式验证 IP 地址?

iOS中电子邮件地址的正则表达式验证并检查空白条目[重复]

正则表达式从字符串中提取 IP 地址 [重复]

使用正则表达式验证IP地址

C# MVC 4 应用程序中的电子邮件地址验证:使用或不使用正则表达式 [重复]

求一个正则表达式验证IP地址