这节课来学习一下什么是re库(正则表达式)
功能:判断字符串是否符合一定标准
注意:是对字符串进行操作,所以操作前应转换为str
本篇是使用方法,正则表达式大全需要另行检索
这里推荐一个正则表达式测试工具箱:http://tooloschina.net/regex/
一、字符串匹配
1.1.首先介绍match()方法
格式:match(正则表达式,待匹配的字符串)
功能:检测这个正则表达式是否匹配这个字符串
特点:从字符串起始位置开始匹配
实例对象的两个方法:
group():输出匹配到的内容
span():输出匹配的范围
import re
content = 'hello 123 4567 world_this is a regex demo'
result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}',content)
>>> print(result)
>>> <_sre.SRE_Match object; span=(0, 25), match = 'hello 123 4567 world_this' >
>>> print(result.group()) # 从第一个字符开始匹配,匹到哪算哪
>>> hello 123 4567 world_this
>>> print(result.span()) # 匹配范围
>>> (0, 25)
1.2.search()
格式:search(正则表达式,待匹配的字符串)
功能:检测这个字符串中是否有能被正则匹配到的内容
特点:match()是从第一个元素开始匹配,若第一个不符则认定为NONE,而search可以从任意位置匹配(中间截取),返回的是第一个匹配到的
实例对象的两个方法:
group(num):输出匹配到的第num个内容
span():输出匹配的范围
1.3.findall()
格式:findall(正则表达式,待匹配的字符串)
功能:检测这个字符串中是否有能被正则匹配到的内容
特点:search返回的是第一个匹配到的,而findall()将字符串中所有满足条件的做成列表返回(可以通过for遍历)
二、字符串修改之—sub()
在之前的字符串处理中我们学过通过replace()方法可以修改字符串。
但数据量大的话就很麻烦。
re库给我们提供了高效的方法:
re.sub()
格式:re.sub(b,B,字符串A):将字符串A中的b修改为B
功能:批量替换
特点:b可以用正则表达式表示,这就很高效了
三、构造正则表达式
通常的正则表达式滴滴答答一长串,直接放在一中里面未免不优雅,所以先给它实例化封装:
compile():可以将字符串编译成正则表达式对象,在后面也能重复使用哦
p = re.compile('\d{2}')
四、一些技巧
4.1 常用的匹配规则
模式 描述
\w # 匹配:字母、数字、下划线
\W # 匹配:不是字母、数字、下划线的字符
\s # 匹配:任意空白字符(等价于[\t\n\r\f])
\S # 匹配:任意非空字符
\d # 匹配:任意数字(等价于[0-9])
\D # 匹配:任意非数字
\A # 匹配:字符串开头
\Z # 匹配:字符串结尾,若存在换行,则匹配到该行最后一个字符
\z # 匹配:字符串结尾,若存在换行,还会匹配到换行符
\G # 匹配:最后匹配完成的位置
\n # 匹配:一个换行符
\t # 匹配:一个制表符
^ # 匹配:一行字符串的开头
$ # 匹配:一行字符串的结尾
. # 匹配:除换行符外的任意字符
[...] # 匹配:一组字符单独列出,如[amk]:匹配a或m或k
[^...] # 匹配:不在[]中的字符
* # 匹配:0个或多个表达式
+ # 匹配:1个或多个表达式
? # 匹配:0个或1个前面正则表达式定义的片段,非贪婪
{n} # 精确匹配:n个前面的表达式
{n, m} # 匹配:n到m次前面正则表达式定义的片段,贪婪
a|b # 匹配:a或b
() # 匹配:括号内的表达式
4.2 匹配目标
想从字符串中提取某个位置的内容,用小括号提取
如:
a = ‘叮叮叮sdfadf!@#¥123当当当’
想要提取叮叮叮和当当当中间的这堆字符
可以这么写
p = re.compile(‘叮叮叮(.*?)当当当’)
(.*?)表示用非贪婪的方式提取任意字符0个或多个
贪婪:当正则表达式最后一个找到匹配项后,再向后找看看还有没有符合的,有就继续匹
非贪婪:当正则表达式最后一个找到匹配项后,不再匹配了,over
4.3 修饰符(可选)
常用的修饰符
re.I # 使匹配对大小写不敏感
re.L # 做本地化识别匹配
re.M # 多行匹配,影响^和$
re.S # 使.匹配包含换行符在内的所有字符(常用)
re.U # 根据Unicode字符集解析字符,影响:\w、\W、\b、\B
re.X # 该标志通过给予你更灵活的格式,以便你将正则表达式写得更易于理解
m = re.findall('正则表达式','被检验的字符串',re.S)
五、小栗子
import re
# 创建模式对象
# 制定规则
pat = re.compile('AA') # 此处的AA是正则表达式的内容,用于验证其他字符串
# 返回none或找到符合正则表达式的字符串位置
m = pat.search('aa') # search字符串被校验的内容
m = pat.search('AA')
m = pat.search('aASDAA')
# 将上面的合并
m = re.search('正则表达式','被检验的字符串')
# 将被检验的字符串中所有符合正则表达式的值作为list返回
m = re.findall('正则表达式','被检验的字符串')
# sub 批量替换
re.sub("a","A","aasdcdwsda") # 在第三个字符串中的a全部替换为A
# 在正则表达式中被比较字符串前面加上r,可避免转义字符
a = r"\aabd-\'"
你学会了吗?