【详解正则表达式验证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]?\d 1\d{2} 2[0-4]\d 25[0-5]
匹配字符串 0-9 10-99 0-99 100-199 200-249 250-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

 

物联沃分享整理
物联沃-IOTWORD物联网 » 【详解正则表达式验证IP地址】

发表评论