【验证IP地址——正则表达式详解】

题目一:

判断一个字符串是否符合ipv4地址,返回true或者false
比如:输入“127.0.0.1”,返回true
     输入"256.1.2.3",返回false

1、题目分析:

IPv4地址由4个十进制数和3个点组成,每个十进制数范围为0-255。比如,127.0.0.1。               

⚠️注意:IPv4地址内的数不会以0开头。比如,地址127.10.111.01 是不合法的。

2、代码实现:

import re
def is_ipv4(str):
    pattern = "([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])(\.([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])){3}$"
    result = re.match(pattern, str)
    if result:
        return "true"
    else:
        return "false"

print('127.0.0.1 :', is_ipv4('127.0.0.1'))
print('256.1.2.3 :', is_ipv4('256.1.2.3'))
print('127.0.0.01 :', is_ipv4('127.0.0.01'))

3、代码解析:

pattern = "([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])(\.([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])){3}$"
分段匹配0-255的整数:
模式\d[1-9]\d[1-9]?\d1\d{2}2[0-4]\d25[0-5]
匹配字符串0-910-990-99100-199200-249250-255
本文涉及到的Python正则表达式模式如下表所示:
模式功能描述
$匹配字符串的末尾
[...]用来表示一组字符,单独列出:[amk] 匹配 ‘a’, ‘m’ 或 ‘k’
\d匹配任意数字,等价于 [0-9]
\.匹配 ‘.’
(re)对正则表达式分组并记住匹配的文本
a|b匹配a或b
{m, n}

匹配m到n次由前面的正则表达式定义的片段,贪婪方式

"ab{3,5}":表示一个字符串有一个a跟着3到5个b。

{n}

精确匹配n个表达式。

例如,o{2} 不能匹配 ‘Bob’ 中的 ‘o’,但是能匹配 ‘food’ 中的 ‘oo’

*

匹配0次或无限次。

"ab*":表示一个字符串有1个a后面跟着0个或若干个b。("a", "ab", "abbb",……)

+

匹配1次或无限次。

"ab+":表示一个字符串有1个a后面跟着至少1个b。("ab", "abb","abbb",……)

?

匹配0次或1次。

"ab?":表示一个字符串有1个a后面跟着0个或者1个b。("a", "ab")

re.match函数

正则表达式-英文regular expression,缩写为 re 。

函数语法:
re.match(pattern, string)

函数参数说明:
pattern表示正则表达式模式,string表示要匹配的字符串。

re.match从字符串的起始位置开始与模式进行匹配,若匹配成功,则返回一个匹配对象,若匹配失败,则返回None。

 

题目二:

编写一个函数来验证输入的字符串是否是有效的IPv4或IPv6地址。

1、题目分析:

IPv6地址由8组16进制数和7个(":")组成,每组表示16比特。
比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334是一个有效的地址。 

⚠️注意:字符串里没有空格或者其他特殊字符,每组16进制数为4位。

2、代码实现:

import re

def validIPAddress(IP):
    pattern_IPv4 = "([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])){3}$"
    pattern_IPv6 = '([\dA-Fa-f]{1,4}\:){7}[\dA-Fa-f]{1,4}$'
    if re.match(pattern_IPv4, IP):
        return 'IPv4'
    if re.match(pattern_IPv6, IP):
        return 'IPv6'
    return 'Neither'

print(validIPAddress('172.16.254.1'))
print(validIPAddress('256.256.256.256'))
print(validIPAddress('1.1.1.01'))
print(validIPAddress('2001:0db8:85a3:0:0:8A2E:0370:7334'))
print(validIPAddress('2001:0db8:85a3:0:0:8A2E:0370:73340'))
print(validIPAddress('2001:0db8::0:0:8A2E:0370:7334'))

3、代码解析:

pattern_IPv6 = '([\dA-Fa-f]{1,4}\:){7}[\dA-Fa-f]{1,4}$'
每一位十六进制数:
模式[\dA-Fa-f]
匹配字符串(不区分大小写)

0 1 2 3 4 5 6 7 8 9 a b c d e f

0 1 2 3 4 5 6 7 8 9 A B C D E F

 

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值