Regexp检查IP是否有效

dut*_*utt 1 python regex

我想知道是否可以将regexp中的值与Python中的regexp系统进行比较.匹配IP的模式很容易,但每个1-3位数不能超过255,这就是我有点难过的地方.

tzo*_*zot 9

这里不需要正则表达式.一些背景:

>>> import socket
>>> socket.inet_aton('255.255.255.255')
'\xff\xff\xff\xff'
>>> socket.inet_aton('255.255.255.256')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
error: illegal IP address string passed to inet_aton
>>> socket.inet_aton('my name is nobody')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
error: illegal IP address string passed to inet_aton
Run Code Online (Sandbox Code Playgroud)

所以:

import socket

def ip_address_is_valid(address):
    try: socket.inet_aton(address)
    except socket.error: return False
    else: return True
Run Code Online (Sandbox Code Playgroud)

请注意,您的计算机上可以接受像"127.1"这样的地址(有些系统,包括MS Windows和Linux,其中丢失的八位字节被解释为零,因此'127.1'相当于'127.0.0.1'和'10 .1.4 '相当于'10 .1.0.4').如果您要求始终有4个八位字节,请更改最后一行:

else: return True
Run Code Online (Sandbox Code Playgroud)

成:

else: return address.count('.') == 3
Run Code Online (Sandbox Code Playgroud)


JAL*_*JAL 6

您需要检查每个位置允许的数字.对于第一个可选数字,可接受的值为0-2.对于第二个,0-5(如果该部分的第一个数字存在,否则为0-9),第三个为0-9.

我在http://www.regular-expressions.info/regexbuddy/ipaccurate.html找到了这个带注释的例子:

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Run Code Online (Sandbox Code Playgroud)

  • *不*使用正则表达式时的一个很好的例子. (7认同)

Joh*_*hin 6

您可以轻松检查4个八位字节的IP地址,而无需使用正则表达式.这是一种经过测试的工作方法:

>>> def valid_ip(ip):
...    parts = ip.split('.')
...    return (
...        len(parts) == 4
...        and all(part.isdigit() for part in parts)
...        and all(0 <= int(part) <= 255 for part in parts)
...        )
...
>>> valid_ip('1.2.3.4')
True
>>> valid_ip('1.2.3.4.5')
False
>>> valid_ip('1.2.   3   .4.5')
False
>>> valid_ip('1.256.3.4.5')
False
>>> valid_ip('1.B.3.4')
False
>>>
Run Code Online (Sandbox Code Playgroud)