Python开发之路 - re模块

1.re模块 正则表达式 就是在做模糊匹配

元字符: .  ^  $  *  + ? {  } [ ] | ( ) \

(1)  .  通配符 可代指任何一个符号 除了 \n 换行符之外

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 匹配任何空白字符;它相当于类【\t \n \f \r \v】

\S 匹配任何非空白字符;它相当于类【^\t \n \f \r \v】

\w 匹配任何字母数字字符;它相当于类【a-z A-Z 0-9_】

\W 匹配任何非字母数字字符;它相当于类【^a-z A-Z 0-9_】

\b 匹配任何一个字符边界,比如空格 , & ,#等 因为python解释器原本就有\b这个转义字符,因此在re模块内调用要在前面加个r,表示raw string 原生字符串

 re.findall(r'a\b','asgva\bag') 拿到a\b 也可以用re.findall('a\\\\b','asgva\bag') ——>  \\ 等于除去\的意义 \\\\ 就等于两个\\ 然后传给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

 

posted @ 2020-02-21 20:24  五号世界  阅读(333)  评论(0编辑  收藏  举报