Python:每日一题 388
本帖最后由 zltzlt 于 2020-5-1 23:41 编辑今天的题目:
验证给定的字符串是否是有效的 IPv4 或 IPv6 地址。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 ~ 255, 用 "." 分割。比如:172.16.254.1。
注意,IPv4 地址内的数不会以 0 开头。例如,地址 172.16.254.01 是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特 (bits) 。这些数字通过 (":") 分割。
例如,2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的 IPv6 地址。
还可以加入一些以 0 开头的数字,字母可以使用大写或小写。
所以,2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 地址(忽略 0 开头,忽略大小写)。
但不能因为某个组的值为 0,而将某个组变为一个空的组,以至于出现 (::) 的情况。
例如,2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
而且,在 IPv6 地址中,多余的 0 也是不被允许的。例如,02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的 IPv6 地址。
如果给定的字符串为合法的 IPv4 地址则输出 'IPv4',为合法的 IPv6 地址则输出 'IPv6' 。
如果既不是合法的 IPv4 或 IPv6 地址则输出 'Neither' 。
说明:给定的字符串中不包含空格或其他特殊字符。
示例 1:
输入:"172.16.254.1"
输出:"IPv4"
示例 2:
输入:"2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
示例 3:
输入:"256.256.256.256"
输出:"Neither"
{:10_298:}欢迎大家一起答题!{:10_298:} 本帖最后由 kinkon 于 2020-5-5 09:27 编辑
不会正则就很无奈了,只能一步步来
def f388(s):
IP4 = 0
for i in s.split('.', 3):
try:
if len(i) > 1 and i == '0' or int(i) > 255:
break
elif i == '+' or i == '-':
break
else:
IP4 += 1
except:
break
if IP4 == 4:
return "IPv4"
IP6 = 0
for i in s.split(':', 7):
if len(i) < 1 or len(i) > 4 or not i.isalnum():
break
if all(ord(j.lower()) <= 102 for j in i):
IP6 += 1
else:
break
if IP6 == 8:
return "IPv6"
return "Neither" 本帖最后由 Twilight6 于 2020-5-2 14:46 编辑
def func(IP):
if ':' not in IP and '.' in IP and not IP.casefold().islower():
temp = IP.split('.')
copy =
if len(copy) == 4 :
for i in range(4) :
if str(copy) == temp:
continue
break
else:
return 'IPv4'
elif (':' in IP) and ('.' not in IP)and ('' not in IP.split(':')):
for i in IP.split(':',7):
if len(i) <= 4:
continue
break
else:
return 'IPv6'
return 'Neither'
ip1 = '172.16.254.1' # 正确IP
ip0 = '172.16.254.01' # 多余零
ip3 = "256.256.256.256" # 超出255
IP0 = '2001:db8:85a3:0:0:8A2E:0370:7334' # 正确IP
IP1 = "2001:0db8:85a3::0000:8a2e:0370:7334" # 少零
IP2 = "02001:0db8:85a3:0000:0000:8a2e:0370:7334" # 多余零
a =
for i in a:
print(func(i))
凑合吧{:9_227:} 最后附上自己的测试
本帖最后由 xiangjianshinan 于 2020-5-2 00:23 编辑
粗制滥造一代码!
def timu388(s):
re = ["IPv4","IPv6","Neither"]
if s.count('.') == 3:
rt = s.split('.')
for i in rt:
if (len(i)>1 and i=='0') or int(i)<0 or int(i)>255:
return re
else:
return re
else:
if s=='0' or '::' in s:
return re
else:
return re
print(timu388("172.16.254.1"))
print(timu388("2001:0db8:85a3:0:0:8A2E:0370:7334"))
print(timu388("256.256.256.256"))
kinkon 发表于 2020-5-1 23:28
应该是388题吧?
看错了,感谢指出~~~ 本帖最后由 xiangjianshinan 于 2020-5-1 23:56 编辑
zltzlt 发表于 2020-5-1 23:42
看错了,感谢指出~~~
2001:0db8:85a3:0000:0000:8a2e:0370:7334
老大,这个出现了两次到底是有效还是无效的呢?感觉是无效的哦。
不好意思,看错啦。我再仔细审题。 本帖最后由 ouyunfu 于 2020-5-2 06:27 编辑
import re
def f388(s:str)->str:
m = re.match('({0,3}:){7}({0,3}){1}', s)
if m:
return 'IPv6' if m.group() == s else 'Neither'
if s.count('.') == 3:
s1 = s.split('.')
for i in s1:
if (len(i)>1 and i=='0') or int(i)<0 or int(i)>255:
return 'Neither'
else:
return 'IPv4' 领鱼币{:10_256:} 本帖最后由 永恒的蓝色梦想 于 2020-5-2 07:37 编辑
这道题还是比较简单的
下面是我几个月前的代码……很烂from re import compile
IPv4=compile("^((?\d|1\d{2}|2\d|25).){3}(?\d|1\d{2}|2\d|25)$")
IPv6=compile("^({1,4}:){7}{1,4}$")
class Solution:
def validIPAddress(self, IP: str) -> str:
if IPv4.match(IP):
return 'IPv4'
elif IPv6.match(IP):
return 'IPv6'
else:
return 'Neither' 话说在代码格式里,$'是发不出来的{:10_247:}
字符消失术 应该用正则表达式吧
可是我正则很烂啊 def daily388(IP: str) -> str:
if '.' in IP:
ipv4 = IP.split('.')
if len(ipv4) != 4:
return 'Neither'
for each in ipv4:
if not each.isdigit() or not 0 <= int(each) <= 255:
return 'Neither'
if each == '0' and len(each) != 1:
return 'Neither'
return 'IPv4'
elif ':' in IP:
ipv6 = IP.split(':')
if len(ipv6) != 8:
return 'Neither'
for each in ipv6:
if '-' in each or not 1 <= len(each) <= 4:
return 'Neither'
try:
int(each, 16)
except ValueError:
return 'Neither'
return 'IPv6'
else:
return 'Neither'
不简洁也不优美 本帖最后由 旅途Z 于 2020-5-2 11:50 编辑
我这令人捉急的正则表达式。。
from re import match
def func388(string):
if "." in string and ".0" not in string and match(r"((?\d?\d|2\d|25)\.){3}(?\d?\d|2\d|25)", string) == string:
return "IPv4"
elif match(r"(([\dA-Fa-f]{1,4}):){7}[\dA-Fa-f]{1,4}", string) == string:
return "IPv6"
else:
return "Neither" 占楼 def f(s):
def ipv4(s):
if s.count('.') == 3:
list1 = s.split('.')
for each in list1:
if each == '' or int(each)<0 or int(each)>255 or each != str(int(each)):
return False
return True
else:
return False
def ipv6(s):
if s.count(':') == 7:
list1 = s.split(':')
for each in list1:
if each == '' or len(each)>4 or not each.isalnum():
return False
return True
else:
return False
if ipv4(s):
return 'IPv4'
elif ipv6(s):
return 'IPv6'
else:
return 'Neither' Twilight6 发表于 2020-5-1 23:29
凑合吧 最后附上自己的测试
输入 "1e1.4.5.6" 出错 zltzlt 发表于 2020-5-2 14:04
输入 "1e1.4.5.6" 出错
好,已经更改。。。{:9_234:}效率越来越低 import re
def func388(IP):
if '.' in IP:
m = re.match('^((25|2\d|\d\d|/d|)\.){3}(25|2\d|\d\d|/d|),s)
if m:
return "IPV4"
else:
return 'Neither'
elif ':' in IP:
m = re.match('^((\w?\w?\w?\w)\:){7}(\w?\w?\w?\w)',s)
print(m)
if m:
return "IPV6"
else:
return 'Neither'
else:
return 'Neither' 本帖最后由 Python3005 于 2020-5-5 08:52 编辑
def fun(ip):
if '.' in ip:
s = ip.split('.')
if len(s) != 4:
return 'Neither'
for each in s:
if each.startswith('0') or not each.isdigit() or int(each) > 255 or int(each) < 0:
return 'Neither'
else:
return 'Ipv4'
elif ':' in ip and '::' not in ip:
s = ip.split(':')
for each in s:
if len(each) > 4 or not each.isalnum():
return 'Neither'
else:
return 'Ipv6'
else:
return 'Neither' 占楼
页:
[1]
2