鱼C论坛

 找回密码
 立即注册
查看: 3331|回复: 29

Python:每日一题 388

[复制链接]
发表于 2020-5-1 23:20:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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"


欢迎大家一起答题!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-1 23:28:49 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-5-5 09:27 编辑

不会正则就很无奈了,只能一步步来
  1. def f388(s):
  2.     IP4 = 0
  3.     for i in s.split('.', 3):            
  4.         try:
  5.             if len(i) > 1 and i[0] == '0' or int(i) > 255:                        
  6.                 break
  7.             elif i[0] == '+' or i[0] == '-':
  8.                 break
  9.             else:
  10.                 IP4 += 1
  11.         except:
  12.             break
  13.     if IP4 == 4:
  14.         return "IPv4"
  15.         
  16.     IP6 = 0        
  17.     for i in s.split(':', 7):
  18.         if len(i) < 1 or len(i) > 4 or not i.isalnum():
  19.             break
  20.         if all(ord(j.lower()) <= 102 for j in i):
  21.             IP6 += 1
  22.         else:
  23.             break
  24.     if IP6 == 8:
  25.         return "IPv6"
  26.     return "Neither"
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 23:29:02 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-2 14:46 编辑
  1. def func(IP):
  2.     if ':' not in IP and '.' in IP and not IP.casefold().islower():
  3.         temp = IP.split('.')
  4.         copy = [int(i) for i in temp if int(i)<=255]
  5.         if len(copy) == 4 :
  6.             for i in range(4) :
  7.                 if str(copy[i]) == temp[i]:
  8.                     continue
  9.                 break
  10.             else:
  11.                 return 'IPv4'
  12.     elif (':' in IP) and ('.' not in IP)  and ('' not in IP.split(':')):
  13.         for i in IP.split(':',7):
  14.             if len(i) <= 4:
  15.                 continue
  16.             break
  17.         else:
  18.             return 'IPv6'
  19.     return 'Neither'



  20. ip1 = '172.16.254.1'    # 正确IP
  21. ip0 = '172.16.254.01'   # 多余零
  22. ip3 = "256.256.256.256" # 超出255
  23. IP0 = '2001:db8:85a3:0:0:8A2E:0370:7334'         # 正确IP
  24. IP1 = "2001:0db8:85a3::0000:8a2e:0370:7334"      # 少零
  25. IP2 = "02001:0db8:85a3:0000:0000:8a2e:0370:7334" # 多余零

  26. a = [ip1,ip0,ip3,IP0,IP1,IP2]
  27. for i in a:
  28.     print(func(i))
复制代码


凑合吧 最后附上自己的测试


评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-1 23:38:39 | 显示全部楼层
本帖最后由 xiangjianshinan 于 2020-5-2 00:23 编辑

粗制滥造一代码!
  1. def timu388(s):
  2.     re = ["IPv4","IPv6","Neither"]
  3.     if s.count('.') == 3:
  4.         rt = s.split('.')
  5.         for i in rt:
  6.             if (len(i)>1 and i[0]=='0') or int(i)<0 or int(i)>255:
  7.                 return re[2]
  8.         else:
  9.             return re[0]
  10.     else:
  11.         if s[0]=='0' or '::' in s:
  12.             return re[2]
  13.         else:
  14.             return re[1]

  15. print(timu388("172.16.254.1"))
  16. print(timu388("2001:0db8:85a3:0:0:8A2E:0370:7334"))
  17. print(timu388("256.256.256.256"))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-1 23:42:15 | 显示全部楼层
kinkon 发表于 2020-5-1 23:28
应该是388题吧?

看错了,感谢指出~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 23:54:53 | 显示全部楼层
本帖最后由 xiangjianshinan 于 2020-5-1 23:56 编辑
zltzlt 发表于 2020-5-1 23:42
看错了,感谢指出~~~




2001:0db8:85a3:0000:0000:8a2e:0370:7334
老大,这个出现了两次  到底是有效还是无效的呢?感觉是无效的哦。


不好意思,看错啦。我再仔细审题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 04:25:01 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-5-2 06:27 编辑
  1. import re
  2. def f388(s:str)->str:
  3.     m = re.match('([0-9a-fA-F][0-9a-fA-F]{0,3}:){7}([0-9a-fA-F][0-9a-fA-F]{0,3}){1}', s)
  4.     if m:  
  5.         return 'IPv6' if m.group() == s else 'Neither'  
  6.     if s.count('.') == 3:
  7.         s1 = s.split('.')
  8.         for i in s1:
  9.             if (len(i)>1 and i[0]=='0') or int(i)<0 or int(i)>255:
  10.                 return 'Neither'
  11.         else:
  12.             return 'IPv4'
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 07:32:37 | 显示全部楼层
领鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 07:35:39 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-2 07:37 编辑

这道题还是比较简单的
下面是我几个月前的代码……很烂
  1. from re import compile
  2. IPv4=compile("^(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])$")
  3. IPv6=compile("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$")
  4. class Solution:
  5.     def validIPAddress(self, IP: str) -> str:
  6.         if IPv4.match(IP):
  7.             return 'IPv4'
  8.         elif IPv6.match(IP):
  9.             return 'IPv6'
  10.         else:
  11.             return 'Neither'
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 07:38:35 | 显示全部楼层
话说在代码格式里,$'  是发不出来的
[code][/code]字符消失术
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 08:09:39 | 显示全部楼层
应该用正则表达式吧
可是我正则很烂啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 09:02:38 | 显示全部楼层
  1. def daily388(IP: str) -> str:
  2.     if '.' in IP:
  3.         ipv4 = IP.split('.')
  4.         if len(ipv4) != 4:
  5.             return 'Neither'
  6.         for each in ipv4:
  7.             if not each.isdigit() or not 0 <= int(each) <= 255:
  8.                 return 'Neither'
  9.             if each[0] == '0' and len(each) != 1:
  10.                 return 'Neither'
  11.         return 'IPv4'
  12.     elif ':' in IP:
  13.         ipv6 = IP.split(':')
  14.         if len(ipv6) != 8:
  15.             return 'Neither'
  16.         for each in ipv6:
  17.             if '-' in each or not 1 <= len(each) <= 4:
  18.                 return 'Neither'
  19.             try:
  20.                 int(each, 16)
  21.             except ValueError:
  22.                 return 'Neither'
  23.         return 'IPv6'
  24.     else:
  25.         return 'Neither'
复制代码

不简洁也不优美

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 11:06:03 | 显示全部楼层
本帖最后由 旅途Z 于 2020-5-2 11:50 编辑

我这令人捉急的正则表达式。。
  1. from re import match


  2. def func388(string):
  3.     if "." in string and ".0" not in string and match(r"(([1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([1]?\d?\d|2[0-4]\d|25[0-5])", string) == string:
  4.         return "IPv4"
  5.     elif match(r"(([\dA-Fa-f]{1,4}):){7}[\dA-Fa-f]{1,4}", string) == string:
  6.         return "IPv6"
  7.     else:
  8.         return "Neither"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 11:10:19 From FishC Mobile | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 12:45:43 | 显示全部楼层
  1. def f(s):
  2.     def ipv4(s):
  3.         if s.count('.') == 3:
  4.             list1 = s.split('.')
  5.             for each in list1:
  6.                 if each == '' or int(each)<0 or int(each)>255 or each != str(int(each)):
  7.                     return False
  8.             return True
  9.         else:
  10.             return False
  11.     def ipv6(s):
  12.         if s.count(':') == 7:
  13.             list1 = s.split(':')
  14.             for each in list1:
  15.                 if each == '' or len(each)>4 or not each.isalnum():
  16.                     return False
  17.             return True
  18.         else:
  19.             return False
  20.     if ipv4(s):
  21.         return 'IPv4'
  22.     elif ipv6(s):
  23.         return 'IPv6'
  24.     else:
  25.         return 'Neither'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-2 14:04:15 | 显示全部楼层
Twilight6 发表于 2020-5-1 23:29
凑合吧 最后附上自己的测试

输入 "1e1.4.5.6" 出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 14:46:16 | 显示全部楼层
zltzlt 发表于 2020-5-2 14:04
输入 "1e1.4.5.6" 出错

好,已经更改。。。效率越来越低
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 15:49:42 | 显示全部楼层
  1. import re
  2. def func388(IP):
  3.     if '.' in IP:
  4.         m = re.match('^((25[0-5]|2[0-4]\d|[1]\d\d|[1-9]/d|[1-9])\.){3}(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]/d|[1-9]),s)
  5.         if m:
  6.             return "IPV4"
  7.         else:
  8.             return 'Neither'
  9.     elif ':' in IP:
  10.         m = re.match('^((\w?\w?\w?\w)\:){7}(\w?\w?\w?\w)',s)
  11.         print(m)
  12.         if m:
  13.             return "IPV6"
  14.         else:
  15.             return 'Neither'
  16.     else:
  17.         return 'Neither'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 08:50:12 | 显示全部楼层
本帖最后由 Python3005 于 2020-5-5 08:52 编辑
  1. def fun(ip):
  2.         if '.' in ip:
  3.                 s = ip.split('.')
  4.                 if len(s) != 4:
  5.                         return 'Neither'
  6.                 for each in s:
  7.                         if each.startswith('0') or not each.isdigit() or int(each) > 255 or int(each) < 0:
  8.                                 return 'Neither'
  9.                 else:
  10.                         return 'Ipv4'
  11.         elif ':' in ip and '::' not in ip:
  12.                 s = ip.split(':')
  13.                 for each in s:
  14.                         if len(each) > 4 or not each.isalnum():
  15.                                 return 'Neither'
  16.                 else:
  17.                         return 'Ipv6'
  18.         else:
  19.                 return 'Neither'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 21:43:58 | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 18:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表