文章目录
导入模块
首先导入re模块
import re
search方法
作用
search方法用于在字符串中搜索正则表达式模式第一次出现的位置。
re.search(r'dog','l like dog')
执行结果:
注意点
- search方法第一个参数,也就是描述的搜索规则,需要使用原始字符串然后前面加个r进行编写,这样可以避免很多不必要的麻烦
- 起始位置是从0开始的,找到就返回,找不到就返回null
用find方法实现如下:
'l like dog'.find('dog')
执行结果:
但是find方法具有局限性,不能使用通配符(正则表达式中的通配符是 . ,能匹配换行符之外的任何字符)
如下:
re.search(r'.','l like dog')
执行结果:
re.search(r'fish.','l like fishc')
执行结果:
通配符(元字符)失效
那么如果我们想匹配.号呢?也就是让通配符失效,那该如何进行呢?如下:
re.search(r'\.','l like dog.')
执行结果:
加个反斜杠( \ )即可做到
反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能
匹配任何数字
re.search(r'\d','a b c 1 2 3')
执行结果:
re.search(r'\d\d\d','avxsdf45679')
执行结果:
匹配一个IP地址(初学版)
re.search(r'\d\d\d.\d\d\d.\d\d\d.\d\d\d','192.168.111.123')
执行结果:
存在两个问题:
- 我们这里写法也就硬性规定每组IP必须三个数字,但是IP每组不一定是三个数字呀。。。假如是192.168.1.1该怎么匹配呢?(慢慢改吗?)
- 然后IP地址的每组范围是0 ~ 255,我们的这种写法的话,它的范围就变成了0 ~ 999
字符类
元字符[ 和元字符] ,即中括号是两个元字符,用它们来创建一个字符类,字符类的含义也就是只需要匹配到字符类中的任何一个字符,都算匹配成功。
完整元字符:
. ^ $ * + ? {
} [ ] \ | ( )
例子1:匹配元音字符:
re.search(r'[aeiou]','l like dog')
执行结果:
注意:
正则表达式默认开启大小写敏感模式,即大写的i和小写的i是有区别的
re.search(r'[aeiouAEIOU]','I like dog')
执行结果:
表示范围(-)
注意,第一个是大写的i,不是小写的L
re.search(r'[a-z]','I like dog')
执行结果:
re.search(r'[0-9]','I like 123456 dog')
执行结果:
re.search(r'[3-9]','I like 123456 dog')
执行结果:
限定重复匹配次数({})
固定次数
re.search(r'bda{3}6','46asd5abdaaa68897')
执行结果:
范围次数
re.search(r'bda{1,6}6','46asd5abdaaaaa68897')
执行结果:
re.search(r'abcde{1,6}asdasd6','123458abcdeeasdasd6465465')
执行结果:
re.search(r'a{1,6}','aaaaaa')
执行结果:
re.search(r'a{1,6}','aaaaaaa')
执行结果:
re.search(r'a{2,6}','aa')
执行结果:
re.search(r'a{2,6}','a')
返回为null
跃跃欲试
用正则表达式匹配188如何操作?
第一种想法
re.search(r'[0-255]','188')
执行结果:
第二种想法
re.search(r'[0-2][0-5][0-5]','188')
执行结果返回为null
注意:正则表达式匹配的是字符串,数字对于字符来说只有0 ~ 9,
r'[0-255]'
这个表示什么意思呢?也就是0 - 2然后两个5 5,重复字符,即匹配四个字符 0 1 2 5[0-2][0-5][0-5]
这代表哪些呢?第一个是0 - 2 (字符0 1 2),第二个是 0 - 5(0 1 2 3 4 5),第三个是 0 - 5(0 1 2 3 4 5),以这些字符组合起来的都能被匹配到,(188后面8 和8字符第二个和第三个里面并没有,所以返回值为null)如下图所示
re.search(r'[0-2][0-5][0-5]','133')
执行结果:
re.search(r'[0-2][0-5][0-5]','011')
执行结果:
re.search(r'[0-2][0-5][0-5]','254')
执行结果:
正确搞法
re.search(r'[0-1]\d\d|2[0-4]\d|25[0-5]','188')
执行结果:
解释:
[0-1]\d\d|2[0-4]\d|25[0-5]
解释一下:[0-1]代表这个字符可以是0或者是1,\d表示0-9,\d表示0-9,| 表示或,即有一个成立则全部成立;2[0-4]\d
2表示字符2,[0-4]表示0 ~ 4, \d表示0 - 9;25[0-5]
2表示字符2,5表示字符5,[0-5]表示0 ~ 5字符。我个人觉得应该和下面代码的字符匹配作用一样的吧
re.search(r'[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]','188')
匹配一个IP地址(进阶版)
版本1
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.111.121')
然后我们利用{}
再控制一下各自的重复次数
版本2
re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.1')