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

Raj*_*eev 12 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>
AttributeError: 'NoneType' object has no attribute 'group'
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 33

为什么不使用库函数来验证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
Run Code Online (Sandbox Code Playgroud)

  • 这里只有一件事。如果您使用这种方法 1 也将根据手册页找到合适的 IP 地址。 (2认同)
  • @Phoenix,是的`1`相当于`0.0.0.1`(应该是).这就是为什么你应该更喜欢专门的库函数来进行正则表达式攻击. (2认同)
  • 旧答案但仍然相关,我认为这不是一个完美的方法,考虑到 OP 需要确保原始字符串需要采用 XXX.XXX.XXX.XXXXX 形式的用例。使用socket.inet_aton将允许ip为“1”,正如@JohnLaRooy上面提到的,这确实是一个有效的IP地址,但在字符串必须包含4个八位位组和一个端口的情况下它可能无效(这是一个未指定的要求)由OP)。在这种情况下,我会考虑使用 socket.inet_aton 和正则表达式方法的组合 (2认同)

Tim*_*ker 25

改为使用锚点:

aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",ip)
Run Code Online (Sandbox Code Playgroud)

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

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

if aa:
    ip = aa.group()
Run Code Online (Sandbox Code Playgroud)

当然,这不是验证IP地址的好方法(请查看gnibbler对正确方法的回答).但是,正则表达式可用于检测更大字符串中的IP地址:

ip_candidates = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", ip)
Run Code Online (Sandbox Code Playgroud)

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

  • 它会在超出ip地址范围的`111.111.111.345`上失败. (7认同)

Lla*_*don 15

\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])$";
Run Code Online (Sandbox Code Playgroud)


Kar*_*tel 13

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您要进行更严格的验证,我将替换“return len(parts) == 4”和“all(0 &lt; len(part) &lt; 4 and 0 &lt;= int(part) &lt; 256”中的部分的验证parts)`,以防万一我们遇到这样的字符串:`1.1.00000000003.1`。 (3认同)
  • 重点在于确保我们不会获得“不是”IP 地址的信息。 (2认同)

Ran*_*nga 5

下面将检查 IP 是否有效:如果 IP 在 0.0.0.0 到 255.255.255.255 之间,则输出将为 true,否则为 false:

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

例子:

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
Run Code Online (Sandbox Code Playgroud)

输出:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)