正则表达式(regular expression)
作用:用来匹配字符串。
设计思想:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,就认为它“匹配”了,否则,该字符串就是不合法的。
格式:正则表达式也是用字符串表示的,注意:带引号
re.split(pattern=,string) #切分字符串 re.match(pattern,string) #匹配 re.compile(pattern=).match(string) #先编译,再匹配 re.match().groups() #返回子串元组格式,注意这里是groups,加了s,下面的没有加s re.match().group(0) #返回原字符串 re.match().group(1) #返回第1个子串 re.match().group(2) #返回第2个子串 #贪婪匹配问题:加个?即可
regular expression,re模块
防 止 转 义:使用Python的r前缀,就不用考虑转义的问题
匹 配:re.match(pattern, string) :判断是否匹配,匹配成功返回一个match对象;否则返回 None。
切分字符串:re.split(格式,字符串 )方法
贪 婪 匹 配:正则表达式默认是贪婪匹配,也就是匹配尽可能多的字符。
分 组:正则表达式还能提取子串,格式:用()表示的就是要提取的分组 group
替 换:re.sub(原来的内容,替换后的,需要替换的字符串) re.sub("d","-","chuan1zhi2") 表示把这个字符串里的数字替换为-
预编译
在Python中使用正则表达式时,re模块内部会做两件事情:
1、编译正则表达式,如果正则表达式的字符串不合法,就会报错;
2、用编译后的正则表达式去匹配字符串。
re.compile(pattern=).match(string).groups()
例子:
1,https://www.bilibili.com/video/BV1Lx411d7Cj?p=24 , 13:21秒讲的例子很好
re模块中常用方法:
#下面的string是指被替换的原始字符串
re.match( )
re.search(pattern, string , flags=0 ) #在全文中匹配一次,匹配到就返回
re.findall(pattern, string, start, end) #在整个字符串中搜索所有符合正则表达式的字符串,匹配所有返回一个列表
re.sub(pattern1, pattern2, string, count, flags ) # 将模式pattern1替换为pattern2
re.subn(pattern1, pattern2, string ) #实现目标的搜索和替换,同时还会以元组形式返回被替换的次数
re.split(pattern, string ) #分割字符串,结果以列表List形式返回
re.match方法使用标志位flags的情况:
flags可选标志位: 如果同时使用多个标志位,使用“ | ”分割。比如re.I | re.M
修饰符 | 描述 | 备注 |
re.I | 使匹配对大小写不敏感 | |
re.S | 使.匹配包括换行在内的所有字符 | |
re.L | 做本地化识别(local-aware)匹配 | |
re.M | 多行匹配,影响^和$ | |
re.U | 根据Unicode字符集解析字符。这个标志影响w, W, , B | |
格式 | 作用 | 备注 |
d | 匹配一个数字 [0-9] | digit |
D | 匹配非数字 | |
w | 匹配单词字符,即a-z,A-Z,0-9,_ | word |
W | 匹配非单词字符 | |
s | 匹配一个空格, , , , f, v,空白,Tab键 | space |
S | 匹配非空白,除空格、tab键之类的 | |
. | 匹配任意字符,但不包含换行符' ';但是在DOTALL模式中可以匹配换行符。 |
'py.'可以匹配'pyc', 'pyo', 'py!' re.findall("."," ",re.DOTALL) 或re.findall("."," ",re.S),re.DOTALL可以简写为re.S |
* | 匹配前一个字符0个到任意个 | |
+ | 匹配前一个字符1个到任意个 | |
? | 匹配前一个字符0个到1个 | |
{n} | 匹配前一个字符n次 | |
{n,} | 匹配前一个字符至少n次 | |
{n,m}, {min, max} | 匹配前一个字符n到m次,n个,n+1个……m个 | n=<字符个数<=m |
[0-9a-zA-Z\_] | 匹配一个字符,限定范围中的任意类型都可以 | 字符个数=1,并不是匹配每种类型一个;不能为0个,空字符串会报错 |
[0-9a-zA-Z\_]+ | 至少有一个字符,限定范围中的任意类型都可以 | 字符个数>=1 |
[0-9a-zA-Z\_]* | 任意个字符(包含0个),限定范围中的任意类型都可以 | 字符个数>=0,只是比+表示的字符多了一个0 |
[0-9a-zA-Z\_]? | 0个或1个字符,限定范围中的任意类型都可以 | 字符个数=0个,1个 |
[a-zA-Z\_][0-9a-zA-Z\_]* | 匹配由字母或下划线开头,后接任意个字符,限定范围中的任意类型都可以 | |
[a-zA-Z\_][0-9a-zA-Z\_]{0,19} | 更精确地限制了变量的长度,前半部分只匹配一个字符,{0,19}是限定后半部分字符的长度 | 所以总的字符长度是1+{0,19}={1,20} |
^ | 表示行的开头 | ^d,表示必须以数字开头 |
$ | 表示行的结束 | d$,表示必须以数字结尾 |
A|B | 可以匹配A或B | (P|p)ython可以匹配'Python' 或'python' |
re模块的match方法 | 匹配字符串 | |
re模块的split方法 | 切分字符串 | |
re模块的group方法,groups方法 | 返回匹配结果,group返回原字符串,groups返回子串元组 |