前戏:string匹配
string提供的是完全匹配
s = 'hello world'
ret = s.find('llo') # 找到字母llo,运行后显示位置
print(ret) # 2
ret1 = s.replace('ll','xx') # 用 xx 替换 ll
print(ret1) # hexxo world
ret2 = s.split('w') # 以w为界限,分割字母,但w会被分割出去
print(ret2) # ['hello ', 'orld']
什么是正则表达式:用一些定义好的特定字符,或者特定字符的集合,组成一个规则,用这个规则,对字符串进行过滤,通过 import re 来调用
一、常用函数
1. match() 函数:从起始位置匹配一个符合规则的字符串,匹配成功返回一个对象,未匹配成功返回None
用法:match(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式
2. search() 函数:查看整个字符串,匹配第一个符合规则的字符串,未匹配成功返回None
用法:search(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式
3. split() 函数:根据匹配模型分割字符串,返回分割后的列表
用法:split(pattern, string, maxsplit=0, flags=0)
pattern: 正则模型
string : 要匹配的字符串
maxsplit:指定分割个数
flags : 匹配模式
4. findall() 函数:查看整个字符串,匹配所有符合规则的字符串,把匹配到的字符串放到一个列表中,未匹配成功返回空列表
用法:findall(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式
二、元字符介绍
1. . 通配符 匹配任意一个字符,换行符\n除外
ret = re.findall('w..l','hello world')
print(ret) # ['worl']
2. ^ 尖角符
ret = re.findall('^h...f','hjisfnlhello') #只从最初开始匹配
print(ret) # ['hjisf']
3. $ 从最后开始匹配
ret = re.findall('e..o$','hjisfnlalexhello')
print(ret) # ['ello']
4. | 表示或的意思,匹配前面或者后面
ret = re.findall('a|b','acbbcbaac')
print(ret) # ['a', 'b', 'b', 'b', 'a', 'a']
5. * 0个或多个字符,贪婪匹配,尽可能多取,取值范围[0,+oo] 贪婪匹配:尽可能多的取匹配
ret = re.findall('ba*','afdhfhnandbbbbbaaabaaaaaaaaa')
print(ret) # ['b', 'b', 'b', 'b', 'baaa', 'baaaaaaaaa']
6. \ 转义符 改变后面字符的意思,使其失去特殊意义
val = re.findall('1.*','11*222223456') # 没有使用转义符,*就会进行贪婪匹配
ret = re.findall('1.\*','11*222223456') # 使用转义符,*就变成了一个普通字符
print(val) # ['11*222223456']
print(ret) # ['11*']
ret1 = re.findall('\\t','asdfa\tsd4654') # 如果要匹配字符串中\t,需要在\t前加\,让\t中的\失去特殊意义
print(ret1) # ['\t']
ret2 = re.findall(r'\t','asdfa\tsd4654') # 也可以在‘’号前加r,让其不进行转义,效果同上
print(ret2) # ['\t']
7. + 取1个或多个字符,贪婪匹配,尽可能多取,取值范围[1,+oo]
ret1 = re.findall('ab+','afdhfhnandbabaaaaabbbaaabbaaa')
print(ret1) # ['ab', 'abbb', 'abb']
ret2 = re.findall('a+b','afdhfhnandbabaabaaaaaaaaaab')
print(ret2) # ['ab', 'aab', 'aaaaaaaaaab']
8. ? 取0个或1个字符,贪婪匹配,尽可能多取,取值范围[0,1]
ret = re.findall('a?b','afdhfhnandbabaabbbaaaaaaaabaa') #匹配到0-1个a
print(ret) # ['b', 'ab', 'ab', 'b', 'b', 'ab']
9. {x} 对前一个字符取x次
a = re.findall('a{5}b','aaaaaaaaaaaaab') #匹配5个a,一个b
print(a) # ['aaaaab']
b = re.findall('a{1,3}b','aaaaaaabbbbbbbbbb') #至少有一个a才能匹配成功,最多3个a,非贪婪模式
print(b) # ['aaab']
10. [ ] 字符集合 可在括号中添加范围
ret = re.findall('[a-z]','adsoAHK12387farSDGKAgag') # 取出字符串中的所有小写字母
print(ret) # ['a', 'd', 's', 'o', 'f', 'a', 'r', 'g', 'a', 'g']
ret1 = re.findall('[A-Z]','adsoAHK12387farSDGKAgag') # 取出字符串中的所有大写字母
print(ret1) # ['A', 'H', 'K', 'S', 'D', 'G', 'K', 'A']
ret2 = re.findall('[0-9]','adsoAHK12387farSDGKAgag') # 取出字符串中的所有数字
print(ret2) # ['1', '2', '3', '8', '7']
ret3 = re.findall('[^A-Z]','adsoAHK12387farSDGKAgag') # ^号表示取反,此处为取所有除大写字母外的字符
print(ret3) # ['a', 'd', 's', 'o', '1', '2', '3', '8', '7', 'f', 'a', 'r', 'g', 'a', 'g']
11. ( ) 分组匹配
ret = re.findall('(ab){2}','abababab') # 这里表示2个ab完成一次匹配,匹配出来的内容为ab
print(ret) # ['ab', 'ab']
三、预定义字符
1. \d 匹配任何十进制数,相当于 [0-9]
ret = re.findall('\d','adfadsf123123')
print(ret) # ['1', '2', '3', '1', '2', '3']
2. \d+ 匹配一位或者多位数字
ret = re.findall('\d+','ad456456fadsf123123')
print(ret) # ['456456', '123123']
3. \D 匹配任何非数字字符,相当于 [^0-9]
ret = re.findall('\D','ad456__456fadsf123123')
print(ret) # ['a', 'd', '_', '_', 'f', 'a', 'd', 's', 'f']
4. \s 匹配任何空白字符,例如: \t \n \f \v 还有空格
ret = re.findall('\s','ad456__456 fadsf123\t12\n3')
print(ret) # [' ', ' ', '\t', '\n']
5. \S 匹配任何非空白字符,[^\t\n\f\v]还有空格
ret = re.findall('\S','ad_456 f13\t12\n3')
print(ret) # ['a', 'd', '_', '4', '5', '6', 'f', '1', '3', '1', '2', '3']
6. \w 匹配包括字母、数字、汉字、下划线,相当于 [a-zA-Z0-9]
ret = re.findall('\w','ad_456 f13\t12\n3')
print(ret) # ['a', 'd', '_', '4', '5', '6', 'f', '1', '3', '1', '2', '3']
7. \W 匹配"非"字母、数字、汉字、下划线,相当于 [^a-zA-Z0-9]
ret = re.findall('\W','ad_456 f13\t12\n3')
print(ret) # [' ', ' ', '\t', '\n']
8. \A 匹配字符串开头
ret = re.findall('\Aad....','ad_456 f13\t12\n3')
print(ret) # ['ad_456']
9. \Z 匹配字符串结尾
ret = re.findall('\d+\Z','ad_456 f13\t12\n333')
print(ret) # ['333']
10. \b 匹配位于开始或者结尾的空字符串
ret = re.findall(r'\b','\tad_45 6f1312333\n') # 中间的空格是上一个的结尾,第二个的开始,所以会匹配两次
print(ret) # ['', '', '', '']
11. \B 匹配不位于开始或结尾的空字符串
ret = re.findall('\d\B','ad_456 f13 12 3') # 检索内容不能位于开头或者结尾
print(ret) # ['4', '5', '1', '1']