一、正则表达式
二、re模块
一、正则表达式与Re模块的之间的关系
1.正则表达式不是python语言所独有的,它是一门独立的技术
2.所有的编程语言都可以使用正则
3.如果你想在python语言中使用正则表达式,你就必须依赖re模块
二、正则
正则就是用来筛选字符串中的特定的内容
书名:正则指引
正则的应用场景:
1.爬虫
2.数据分析
想匹配内容的两种方式:
1.可以直接写完整的内容,不需要写正则
2.通过正则来进行匹配
正则的用法
1.字符组:符号用[]表示,一个字符组每次只能匹配一个字符
在同一个位置可能出现的各种字符组成了一个字符组
形式:
[0123456789] 表示只要匹配的字符是0,1,2,3,4,5,6,7,8,9中的一个字符即可,一个一个字符匹配,不在里面False
[0-46-9] 表示只要匹配的字符是0,1,2,3,4,6,7,8,9中的一个字符即可,一个一个字符匹配,不在里面False
[0] 表示只要匹配的字符是0这个字符才可以,一个一个字符匹配,不在里面False
2.字符
注意点:
1. ^与$符连用 会精准限制匹配的内容,两者中间写什么 匹配的字符串就必须是什么,多一个也不想少一个也不行
2. abc|ab 一定要将长的放在前面,匹配时将长的匹配字符串放在前面,若长的放在后面,则默认以短的进行匹配
3. [^] 除了[]写的字符 其他都要
4.正则在匹配的时候默认都是贪婪匹配(尽量匹配最多)
怎么来避免出现贪婪匹配:你可以通过在量词后面加一个?,就可以将贪婪匹配变成非贪婪匹配
量词必须跟在正则符号的后面
量词只能能够限制紧挨着它的那一个正则符号
分组:当多个正则符号需要重复多次的时候或者当做一个整体进行其他操作,那么可以分组的形式
分组在正则的语法中就是()
用法:^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14} 注意长的放前面,短的放后面
^[1-9]\d{14}(\d{2}[0-9x])?$ ()表示分组,将\d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
转义符 \
如果想匹配某个转义字符,需要在匹配的转义字符前面在加\即可 \\n 匹配 \n
贪婪匹配:
二、re模块
Import re
方法:
1.re.findall(('正则表达式','带匹配的字符串')) 返回的结果是一个列表
2.re.search(('正则表达式','带匹配的字符串')) 返回的结果是一个对象地址,用对象结果.group() 返回一个列表
1.re.match(('正则表达式','带匹配的字符串')) 返回的结果是一个对象地址,用对象结果.group() 返回一个列表
注意:当正则中有组时(),findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可(在括号内匹配对象前些?:即可)
ret1 = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # 忽略分组优先的机制
# print(ret1,ret2) # ['oldboy'] [www.'oldboy'.com]
注意:
1.search只会依据正则查一次 只要查到了结果 就不会再往后查找
2.当查找的结果不存在的情况下 调用group直接报错
怎么来避免正则匹配后.group()时不出现报错,用到条件判断,在判断re.search()是,返回的值是不是为空。如果不为空,执行.Group()语句
注意:
1.match只会匹配字符串的开头部分
2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
Re模块中的其他正则方法
- re.split ('正则表达式','带匹配的字符串') 返回的是一个列表 没有匹配到,不分割
- re.sub('正则表达式', 替换后的字符或字符串,字符串,n(替换个数)) 返回的是一个字符串,没有匹配到返回原字符串
- re.subn('正则表达式', 替换后的字符或字符串,字符串,n(替换个数)) 返回的是一个元祖,没有匹配到的,返回原字符串
- re.compile('正则表达式') 返回的是一个正则表达式对象,通过search,match 变成一个对象地址,在通过group 显示出现
- re.finditer('正则表达式', 替换后的字符或字符串) 返回的是一个可调用对象,然通过.__next__.group()取值
注意:当split以分组的正则匹配一个字符串时,返回的结果 把切割的部分也加上了