leetcode(力扣) 468. 验证IP地址 (模拟+正则)

题目描述

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 “IPv4” ;如果是有效的 IPv6 地址,返回 “IPv6” ;如果不是上述类型的 IP 地址,返回 “Neither” 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:

  • 1 <= xi.length <= 4
  • xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( ‘a’ 到 ‘f’ )和大写英文字母( ‘A’ 到 ‘F’ )。
  • 在 xi 中允许前导零。

例如 “2001:0db8:85a3:0000:0000:8a2e:0370:7334” 和 “2001:db8:85a3:0:0:8A2E:0370:7334” 是有效的 IPv6 地址,而 “2001:0db8:85a3::8A2E:037j:7334” 和 “02001:0db8:85a3:0000:0000:8a2e:0370:7334” 是无效的 IPv6 地址。

简化题目

IPv4规则:

  • 按’.'分割字符串后需要长度为4;
  • 分割的每个字符串长度在1到3之间;
  • 可以解析为数字;
  • 不含前导零然后大小在0到255之间;

IPv6规则:

  • 按’:'分割字符串后需要长度为8;
  • 且分割的每个字符串长度在1到4之间;
  • 每个字符都需要在0-9或a-f或A-F中;

思路分析

按照上面的规则一步一步写就可以了。
可以模拟,可以正则。

法一(模拟):

模拟法代码写的比较多,但是很好懂。

完整代码

class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        for i in queryIP:
            if i == '.':
                # IPV4
                res = queryIP.split('.')
                if len(res) != 4: # 分割后长度需为4.
                    return  "Neither"
                for j in res:
                    if not j.isdigit(): # 判断是否只有数字
                        return "Neither"
                    if int(j) < 0 or int(j) > 255: # 每个字符大小需要在 0~255之间
                        return "Neither"
                    if len(j)<1 or len(j)>3:  # 每个字符长度需要在 1~3之间
                        return "Neither"
                    if j[0] == '0': # 若有前导0 则必须是只有一个0,00都不行
                        if len(j) > 1:
                            return "Neither"
                    

                return "IPv4"
            elif i == ':':
                # IPV6
                res = queryIP.split(":")
                if len(res) != 8: # IPv6 长度为8
                    return "Neither"
                for k in res:
                    if len(k) < 1 or len(k) > 4: # 每个字符长度为1~4
                        return "Neither"
                    temp = "0123456789abcdefABCDEF" # ipv6可能的字符
                    for p in k: # 每个字符看是不是在0~9 a~f A~F
                        if p not in temp:
                            return "Neither"
                return "IPv6"
        return "Neither"

法二(正则):

正则实际上不是整体去正则,那样比较容易出错还很乱,我是先分割了一下,然后再对每一个小块进行正则。

有一个比较容易出错地方在判断IPv4的时候,不允许前导0,ipv4的每一个小段里最多3个字符,所以是[1-9]先确定第一个字符不是0。那就还剩下最多2个字符,所以\d{0,2}。

完整代码

class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        import re
        ipv4 = queryIP.split(".")
        ipv6 = queryIP.split(":")
        if len(ipv4) == 4:
            for i in ipv4:
                if not (re.match('^0$|(^[1-9]\d{0,2}$)',i) and int(i) < 256):
                    return "Neither"
            return 'IPv4' 
        elif len(ipv6) == 8:
            for j in ipv6:
                if not re.match('^[0-9a-fA-F]{1,4}$',j):
                    return "Neither"
            return 'IPv6'
        return "Neither"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值