使用正则表达式在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
将匹配像 00
或 333
这样的数字,它们不是有效的 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 < len(part) < 4 and 0 <= int(part) < 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 地址?