3 回答

TA贡献1895条经验 获得超3个赞
看起来您正在尝试验证IP地址。正则表达式可能不是最好的工具。
如果您想接受所有有效的IP地址(包括您可能甚至不知道的某些地址都有效),那么您可以使用IPy (源):
from IPy import IP
IP('127.0.0.1')
如果IP地址无效,则会引发异常。
或者你可以使用socket (来源):
import socket
try:
socket.inet_aton(addr)
# legal
except socket.error:
# Not legal
如果你真的只想将IPv4与4个小数部分匹配,那么你可以在dot上进行拆分并测试每个部分是0到255之间的整数。
def validate_ip(s):
a = s.split('.')
if len(a) != 4:
return False
for x in a:
if not x.isdigit():
return False
i = int(x)
if i < 0 or i > 255:
return False
return True
请注意,您的正则表达式不会执行此额外检查。它将接受999.999.999.999作为有效地址。

TA贡献1802条经验 获得超10个赞
我通常是极少数坚持捍卫正则表达式的Python专家之一(他们在Python社区中声名狼借),但这不是其中之一 - 接受(比方说)'333.444.555.666'作为“IP地址”是真的太差了,如果你需要的RE匹配后做更多的检查,多使用稀土的一点是无论如何丢失。所以,我衷心地第二个@Mark的建议:IPy的普遍性和优雅(如果你想要支持IPv6!),字符串操作和int检查,如果你只需要IPv4(但是,请考虑一下这个限制,然后再想一想 - - IPv6的的时间的方式来- )!
def isgoodipv4(s):
pieces = s.split('.')
if len(pieces) != 4: return False
try: return all(0<=int(p)<256 for p in pieces)
except ValueError: return False
我宁愿这样做而不是一个复杂的RE来匹配0到255之间的数字! - )
添加回答
举报