zltzlt 发表于 2020-5-1 23:20:35

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-1 23:28:49

本帖最后由 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-1 23:29:02

本帖最后由 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-1 23:38:39

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

zltzlt 发表于 2020-5-1 23:42:15

kinkon 发表于 2020-5-1 23:28
应该是388题吧?

看错了,感谢指出~~~

xiangjianshinan 发表于 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
老大,这个出现了两次到底是有效还是无效的呢?感觉是无效的哦。


不好意思,看错啦。我再仔细审题。

ouyunfu 发表于 2020-5-2 04:25:01

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

永恒的蓝色梦想 发表于 2020-5-2 07:32:37

领鱼币{:10_256:}

永恒的蓝色梦想 发表于 2020-5-2 07:35:39

本帖最后由 永恒的蓝色梦想 于 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'

永恒的蓝色梦想 发表于 2020-5-2 07:38:35

话说在代码格式里,$'是发不出来的{:10_247:}
字符消失术

March2615 发表于 2020-5-2 08:09:39

应该用正则表达式吧
可是我正则很烂啊

March2615 发表于 2020-5-2 09:02:38

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:06:03

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

kinkon 发表于 2020-5-2 11:10:19

占楼

风魔孤行者 发表于 2020-5-2 12:45:43

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'

zltzlt 发表于 2020-5-2 14:04:15

Twilight6 发表于 2020-5-1 23:29
凑合吧 最后附上自己的测试

输入 "1e1.4.5.6" 出错

Twilight6 发表于 2020-5-2 14:46:16

zltzlt 发表于 2020-5-2 14:04
输入 "1e1.4.5.6" 出错

好,已经更改。。。{:9_234:}效率越来越低

whosyourdaddy 发表于 2020-5-3 15:49:42

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:50:12

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

Lao_Long 发表于 2020-5-11 21:43:58

占楼
页: [1] 2
查看完整版本: Python:每日一题 388