使用正则表达式在python中验证ip地址

使用正则表达式在python中验证ip地址,python,regex,Python,Regex,在下面的ip地址验证中,我想看看它是否是有效的ip地址。如何使用下面的re >>> ip="241.1.1.112343434" >>> aa=re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^0-9]",ip) >>> aa.group() Traceback (most recent call last): File "<stdin>", line 1, in <module

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

>>> ip="241.1.1.112343434" 
>>> aa=re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,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=“241.1.1.1123434” >>>aa=re.match(r“\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}[^0-9]”,ip) >>>aa.小组( 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:“非类型”对象没有属性“组” 改用锚定:

aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",ip)
这样可以确保字符串的开始和结束在正则表达式的开始和结束处匹配。(从技术上讲,您不需要起始的
^
锚点,因为它隐含在
.match()
方法中)

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

if aa:
    ip = aa.group()
当然,这不是验证IP地址的好方法(请查看gnibbler的答案,以获得正确的方法)。但是,正则表达式对于检测更大字符串中的IP地址非常有用:

ip_candidates = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", ip)

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

为什么不使用库函数验证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
ip=“241.1.1.1123434” >>>插座。内网(ip) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 socket.error:传递给inet_aton的IP地址字符串非法
\d{1,3}
也将匹配像
00
333
这样的数字,这将是无效的ID

这是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])$";
试试看:
零件=ip分割(“.”)

返回len(parts)==4和all(0以下内容将检查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
[0>>[0>您的_ip=“10.10.10.256”
>>> [0>

regex是一种糟糕的ip地址检查方法。您必须将数字匹配到255,但不能匹配到256,因此要正确地匹配regex,这里只有一件事。如果您使用这种方法,根据手册页,1也将是合适的ip地址。@Phoenix,是的
1
相当于
0.0.0.1
(应该是这样的)这就是为什么你应该更喜欢专门的库函数而不是正则表达式黑客。这是我认为最好的方法。正则表达式黑客总是容易出错,使用内置函数进行验证应该是第一选择。旧的答案,但仍然相关,考虑到OP需要确保最初的字符串需要采用XXX.XXX.XXX.XXXXX的形式。使用socket.inet_aton将允许ip为“1”,正如@johnlaroy所提到的,这确实是一个有效的ip地址,但如果字符串必须包含4个八位字节和一个端口,则可能无效(这是OP未指定的要求)在这种情况下,我会考虑使用SoCKET.InEntAtand和ReGEX方法,这在我的情况下是更好的。谢谢。如果您要进行更严格的验证,我将替换验证<代码>返回LeN(部分)=4和全部(0<LEN(部分))。<4和0@LuissRicardo在什么情况下ip地址会是这样的?甚至会以那种格式返回?关键是要确保我们没有得到不是ip地址的东西。你真的运行此代码来显示输出吗?我怀疑,
你的ip
是一个无效的变量名。而且我看到这个答案已经被输入了是的,我已经运行了代码并获得了正确的输出。如果有任何错误,请告诉我问题是-一段代码发布了一个拼写错误,它无法执行,但输出仍然显示。如果您想显示输出,请确保您发布了相同的代码t已执行,没有其他内容。是的,发布了已执行的代码。感谢您指出。在ip地址范围之外的
111.111.111.345
上将失败。导入重新定义为\u有效的\u ip(ip):ipv=re.match(r^(\d{1,3})\(\d{1,3})\(\d{1,3})\。(\d{1,3})\。(\d{1,3})$”,ip)返回布尔(ipv)和all(map(lambda n:0此操作无法验证0.0.0.0
[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
>>>