在下面的ip地址验证中,我想看看它是否是一个有效的IP地址,我怎么能用下面的方法做到这一点
>>> 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'
答案 0 :(得分:31)
为什么不使用库函数来验证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 :(得分:24)
使用锚点代替:
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。
答案 2 :(得分:12)
\d{1,3}
会匹配00
或333
等号码,但这些号码不是有效身份证明。
This是一个很好的答案,引用:
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])$";
答案 3 :(得分:8)
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
答案 4 :(得分:0)
以下将检查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
示例:强>
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
>>>