鱼c笔记——Python正则表达式(一):匹配IP地址

xiaoxiao2021-02-28  8

之前我们发现,通过字符串的find方法查找十分的麻烦,而且不具备通用性。所以,我们想,能不能利用我们要查找字符串的特征进行查找呢,这时候就得使用Python的正则表达式了。正则表达式是能够描述一些复杂规则的一个工具,所以面对这些问题时,使用正则表达式会十分简单。

不同语言实现正则表达式的方法不同,Python是通过re模块来实现的。

下面将具体的给出例子演示re模块中的search()方法的用法:

代码模块一将演示:

re.search()初步用法

正则表达式元字符

>>> import re >>> re.search(r'fish', 'cat enjoys eating fish') #search()方法用于在字符串里搜索正则表达式模式第一次出现的位置。有两点要注意的,正则表达式模式要使用原始字符串,即前面加上r。起始位置是从0开始的,找不到返回None <_sre.SRE_Match object; span=(18, 22), match='fish'> >>> 'cat enjoys eating fish'.find('fish') #上个例子字符串方法也能实现,后面将举一个不能实现的 18 >>> re.search(r'Fish', 'cat enjoys eating fish') #一个找不到的例子,可以看见什么都没有出现,可以通过print方法显示 #例子:find方法没办法实现的。我们大家或多或少的知道使用 * 或 ? 通配符用来表示任何字符,例如我们想要找到word类型的文件可以这样搜索:*.docx(docx是word文件的后缀名,*通配任何文件名)。正则表达式也有所谓的通配符,不过是以.来实现的,可以匹配除了换行符以外的任何字符. >>> re.search(r'.', 'cat enjoys eating fish') #匹配到了'c' <_sre.SRE_Match object; span=(0, 1), match='c'> >>> re.search(r'fis.', 'cat enjoys eating fish')#匹配到了'h' <_sre.SRE_Match object; span=(18, 22), match='fish'> >>> re.search(r'\.', 'www.baidu.com') #若只想匹配.号本身:正如Python的字符串规则,想要消除一个字符串的特殊功能,可以其前加上反斜杠\ <_sre.SRE_Match object; span=(3, 4), match='.'>

代码模块二将演示:

元字符反斜杠\的功能

匹配IP地址的第一次尝试

五个元字符[ 、]、  -、 {、 }  

>>> re.search(r'\d', 'i love 123')#反斜杠\有剥夺元字符(这个字符本身有其他含义)的特殊能力的作用,还有使普通字符拥有特殊能力的作用。比如可以使用\d匹配任何数字 <_sre.SRE_Match object; span=(7, 8), match='1'> >>> re.search(r'\d\d\d', 'i love 123') #每一个\d匹配一个数字 <_sre.SRE_Match object; span=(7, 10), match='123'> #尝试匹配一个IP地址 >>> re.search(r'\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d', '192.168.111.123' <_sre.SRE_Match object; span=(0, 15), match='192.168.111.123'> )#但显然IP地址每位可能没有三位,而且每位的范围只是0~255,因此还要改进 #匹配元音字母 >>> re.search(r'[aeiou]', 'cat enjoys eating fish')#首先为了表示字符串的范围,我们可以创建一个叫字符类的东西,使用中括号[](其实是;两个元字符[ 、])来创建一个字符类,字符类的含义是,只要匹配到这个字符类中任何一个字符都算匹配上。 <_sre.SRE_Match object; span=(1, 2), match='a'> #匹配所有的小写字符 >>> re.search(r'[a-z]', 'I love study')#在适配类中可以使用元字符-表示适配的范围。 <_sre.SRE_Match object; span=(2, 3), match='l'> #正则表达式默认开启大小写敏感模式的,解决方案:关闭大小写敏感或者修改字符类、正则表达式模式。因此没有匹配到I >>> re.search(r'ab{3}c', 'abbbc')#匹配IP地址时数字范围的问题已解决,第二个问题是匹配个数的问题,限定匹配重复的次数我们可以使用元字符{ }来解决,{}表示前面的字符重复的次数 <_sre.SRE_Match object; span=(0, 5), match='abbbc'> >>> re.search(r'ab{3}c', 'abbbbc')#只能严格的匹配多少次 >>> re.search(r'ab{3,9}c', 'abbbbbbbc')#还可以给出重复次数的范围,注意不能用-代替,逗号之后也不能有空格 <_sre.SRE_Match object; span=(0, 9), match='abbbbbbbc'> >>> re.search(r'ab{3-9}c', 'abbbbbbbc') >>> re.search(r'ab{3, 9}c', 'abbbbbbbc')

代码模块三将演示:

再次尝试匹配IP地址以及最后的结果

元字符( 、 )的作用 

>>> re.search(r'[0-255]', '188')#第一次尝试使用正则表达式匹配0~255之间的数字,比如188 <_sre.SRE_Match object; span=(0, 1), match='1'> >>> re.search(r'[0-2][0-5][0-5]', '188') #第二次尝试使用正则表达式匹配0~255之间的数字,比如说188 #结果匹配不到。 #原因是正则表达式匹配的是字符串,所以数字对于字符来说只有0-9,所以‘123’是由‘1’‘2’‘3’三个字符组成。因此第一次尝试中[0-255]这个字符类相当于这样断句[0-2 5 5],就是匹配0-2和5这4个数字的任何一个 >>> re.search(r'[01]\d\d|2[0-4]\d|25[0-5]', '188')#所以要匹配0-255间任何一个数字应该这样写,其中|和逻辑或是一种功能。这个表达式把0~255划分成了三个区间来匹配:0~199,200~249,250~255 <_sre.SRE_Match object; span=(0, 3), match='188'> >>> re.search(r'(([01]\d\d|2[0-4]\d|25[0-5])\.){3}([01]\d\d|2[0-4]\d|25[0-5])','192.168.1.1') #再次尝试匹配IP地址,不幸失败 #其中小括号()表示分组,和数学中小括号起到的作业是类似的,一个小组就是一个整体,再在后面加上一个重复的次数3 #失败原因是我们并没有充分的考虑到数字的位数,比如说数字1我们并不会写成001 #改进 >>> re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2{0,1}[0-4]{0,1}\d{0,1}|2{0,1}5{0,1}[0-5]{0,1})\.){3}([01]{0,1}\d{0,1}\d{0,1}|2{0,1}[0-4]{0,1}\d{0,1}|2{0,1}5{0,1}[0-5]{0,1})','192.168.1.1') #每个字符匹配0次或1次 <_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>

值得注意的是,最后得出的IP地址的匹配还是有些小BUG的

转载请注明原文地址: https://www.6miu.com/read-2350362.html

最新回复(0)