1.re模块 正则表达式 就是在做模糊匹配
元字符: . ^ $ * + ? { } [ ] | ( )
(1) . 通配符 可代指任何一个符号 除了 换行符之外
re.findall('c..f','asfgfgcwqfgag') ——>此时找到的就是cwqf
(2) ^ 开头符 匹配字符串的开头
re.findall('^a..f','afsfwqrr')——>此时找到的就是afsf
(3) $ 结尾符 匹配字符串的结尾 要放在第一个参数的末尾
re.findall('a..r$','gdsgsasxr')——>此时找到的就是asxr
(4) * 查找出现的重复字符 匹配0到无穷次的内容 属于贪婪匹配
re.findall('exaf*','fadgalexadfzzzdl') 此时能得到exa
(5) + 匹配1到无穷次的内容 属于贪婪匹配
re.findall('exaf+','fadgalexadfzzzdl') 此时不能得到exa,因为至少要有一个f
(6) ? 匹配0到1次的值
re.findall('galf?','fadgalexadfzzzdl') 此时输出值为gal
(7) { }次数可以自己设置
{0,} 等同于*
{1,} 等同于+
{0,1} 等同于?
re.findall('gale{0,3}','fadgaleexadfzzzdl') 此时输出值为galee
* + ? 都是贪婪匹配,后面加?可以使其变成惰性匹配
re.findall('gale+?','fadgaleexadfzzzdl') 此时输出值gale 因为+的范围为1到无穷
(8) [ ] 字符集 表示或者 [ ]里没有特殊符号 除了三个 1. - 符号 a-z 表示范围a到z 2. ^除去 [^a-z ] 表示除去a到z 3. 转义
re.findall('www[bai asg]','fadgaleewwwbxawwwidfzzzdl') 此时输出值为wwwb 和 wwwi
数学运算里取最里层部分:
re.findall('([^()]*)','45+(2*2+(2-1))')
(9) 转义字符
后面跟元字符去除特殊功能 如 . ?
d 匹配任何十进制数;它相当于类【0-9】 匹配字符串中所有数字可以用: d+
D 匹配任何非数字符;它相当于类【^0-9】
s 匹配任何空白字符;它相当于类【 f v】
S 匹配任何非空白字符;它相当于类【^ f v】
w 匹配任何字母数字字符;它相当于类【a-z A-Z 0-9_】
W 匹配任何非字母数字字符;它相当于类【^a-z A-Z 0-9_】
匹配任何一个字符边界,比如空格 , & ,#等 因为python解释器原本就有这个转义字符,因此在re模块内调用要在前面加个r,表示raw string 原生字符串
re.findall(r'a','asgvaag') 拿到a 也可以用re.findall('a\\b','asgvaag') ——> \ 等于除去的意义 \\ 就等于两个\ 然后传给re模块 再进行转义
(10) | 管道符 表示或者
re.findall(r'ac|b','dsgacdgsbg') 输出值为——> ['ac', 'b']
(11) ()分组符号
re.search() 找到一个之后就不再找了 用re.search().group()取值
(?P<>) 固定分组格式
re.search('(?P<name>[a-z]+)(?P<age>d+)','chris26joe27lin7').group('age') 此时输出值为26
分组时内部有优先级,优先处理括号内的值,?:可以去除优先级,如下
import re a = re.findall('www.(baidu|163).com','gadgwww.baidu.comgggw') b = re.findall('www.(?:baidu|163).com','gadgwww.baidu.comgggw') print(a,b)
此时输出值为['baidu'] ['www.baidu.com']
2.re模块下的方法
(1)re.findall() 输出结果为一个列表
(2)re.search() 取值用re.search().group() 只匹配一个
(3)re.match() 只从开头开始匹配
re.match('d+','24fasd').group() 取出值为24
(4)re.split()
re.split('[ |]','asg fs|aa') 匹配由空格和管道符分开的数据 输出值为['asg','fs','aa']
re.split('[ab]','facbe') 此时输出值为['f','','c','','e']
(5)re.sub() 替换方法
re.sub('d+','A','dfg42gdsg31d') 将所有数字换为A 输出值为dfgAfdsgAd
最后也能加个参数,规定匹配次数
(6)re.subn() 与sub()差不多 得到的结果会告诉你匹配的次数
(7)re.compile() 编译 可赋予变量方法和规则 重复使用相同规则时方便
import re com = re.compile('d+') a = com.findall('chris25gep29') print(a)
(8)re.finditer() 可将得到的数据封装到一个迭代器内
import re ret = re.finditer('d+','chris26joe27lin7') print(next(ret).group()) print(next(ret).group())
此时取到两个值26 27