鱼C论坛

 找回密码
 立即注册
查看: 2859|回复: 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"


欢迎大家一起答题!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-1 23:28:49 From FishC Mobile | 显示全部楼层
本帖最后由 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] == '0' or int(i) > 255:                        
                break
            elif i[0] == '+' or i[0] == '-':
                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"

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [int(i) for i in temp if int(i)<=255]
        if len(copy) == 4 :
            for i in range(4) :
                if str(copy[i]) == temp[i]:
                    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 = [ip1,ip0,ip3,IP0,IP1,IP2]
for i in a:
    print(func(i))

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


评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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]=='0') or int(i)<0 or int(i)>255:
                return re[2]
        else:
            return re[0]
    else:
        if s[0]=='0' or '::' in s:
            return re[2]
        else:
            return re[1]

print(timu388("172.16.254.1"))
print(timu388("2001:0db8:85a3:0:0:8A2E:0370:7334"))
print(timu388("256.256.256.256"))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

看错了,感谢指出~~~
想知道小甲鱼最近在做啥?请访问 -> 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
老大,这个出现了两次  到底是有效还是无效的呢?感觉是无效的哦。


不好意思,看错啦。我再仔细审题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 04:25:01 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-5-2 06:27 编辑
import re
def f388(s:str)->str:
    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)
    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]=='0') or int(i)<0 or int(i)>255:
                return 'Neither'
        else:
            return 'IPv4'

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 07:32:37 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这道题还是比较简单的
下面是我几个月前的代码……很烂
from re import compile
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])$")
IPv6=compile("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{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'

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2020-5-2 08:09:39 | 显示全部楼层
应该用正则表达式吧
可是我正则很烂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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] == '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'
不简洁也不优美

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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"(([1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([1]?\d?\d|2[0-4]\d|25[0-5])", 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"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 11:10:19 From FishC Mobile | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

输入 "1e1.4.5.6" 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好,已经更改。。。效率越来越低
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 15:49:42 | 显示全部楼层
import re
def func388(IP):
    if '.' in IP:
        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)
        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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 21:43:58 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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