19

在下面的 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'
4

5 回答 5

40

为什么不使用库函数来验证 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
于 2012-04-10T10:05:24.250 回答
36

改用锚点:

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。

于 2012-04-10T10:04:23.750 回答
20

\d{1,3}将匹配数字,例如00or 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])$";
于 2012-04-10T10:05:41.133 回答
15
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
于 2012-04-10T11:59:01.557 回答
3

下面将检查一个 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
>>>
于 2016-03-11T12:55:46.430 回答