re模块

一 re模块的基础方法:

1.findall查找 :匹配所有 每一项都是列表中的一个元素

findall(正则表达式,待匹配的字符串,flag)

 1 ret=re.findall('\d+',"sjshhdh123nd33")
 2 
 3 结果:['123'   '33']
 4 
 5 
 6 
 7 ret=re.findall('\d',"sjshdh123nd33")
 8 
 9 
10 结果:['1','2','3','3','3']
findall查找的小例子


search查找:只匹配从左到右的第一个,得到的不是直接结果(而是迭代器),而是一个变量,通过这个变量的group方法来获取结果.如果没有匹配到,会返回None,使用group会报错

1 ret=re.search('\d+',"jkhk172按实际花费928")
2 print(ret)       结果的到一个内存地址,这是一个正则匹配的结果  
3  得到:<_sre.SRE_Match object; span=(5, 8), match='172'>
4 
5 print(ret.group())   
6 
7 得到:172      (得到从左到右的第一个数字)
search查找
1 ret=re.search('\d+',"kkhhddhjfj")    待查找的字符串中没有数字,结果会报错
2 print(ret.grounp())
3 
4 结果:报错
search查找,没有时会报错
1 ret=re.search('\d+','jkhk172按实际花费928')
2 if ret:
3      print(ret.grounp())
4 
5 
6 
7 结果:172
search查找


 

match查找:从头开始匹配,相当于search中的正则表达式加上一个^

 1 ret=re.match('\d+$',"172sjkhk按实际花费928'")  '\d+$' 从头开始匹配,到s时不是数字了,结果是None
 2 print(ret)
 3 
 4 
 5 结果:None
 6 
 7 
 8 
 9 
10 ret=re.match('\d+$',"172928'")  
11 print(ret)
12 
13 结果:<_sre.SRE_Match object; span=(0, 6), match='172928'>
14 
15 print(ret.grounp)
16 
17 结果:172928
match查找的例子


二 字符串处理的方法

1 split(切割)

1 # s = 'alex83taibai40egon25'
2 ret=re.split('\d+',s)
3 print(ret)
4 
5 
6 结果:['alex', 'taibai', 'egon', '']
split切割

 2 sub替换与subn替换

 1 ret=re.sub('\d+','H',"alex83taibai40egon25")   用'H'来替换字符串中的数字
 2 print(ret)
 3 
 4 结果:alexHtaibaiHegonH
 5 
 6 
 7 
 8 ret =re.sub('\d+','H',"alex83taibai40egon25",1)用'H'来替换字符串中的数字替换1次
 9 print(ret)
10 
11 结果:alexHtaibai40egon25   (83被替换掉)
12 
13 
14 
15 
16 ret=re.subn('\d+','H',"alex83taibai40egon25")   返回一个元组
17 print(ret)
18 
19 结果:(alexHtaibaiHegonH,3)    返回结果的第个元素是被替换的次数
sub与sunb的替换区别

sub 与subn的区别:
 subn返回的结果 有被替换次数的显示,而sub只是返回结果

 

三 re模块的进阶:时间/空间

1 compile :节省你使用正则表达式解决问题的时间,编译正则表达式编译成字节码,在多次使用的过程中,不会多次编译.

 1 import re
 2 ret=compile('\d+')
 3 print(ret)    结果:re.compile('\\d+')
 4 res=ret.findall('alex83taibai40egon25')   使用findall查找全部数字
 5 print(res)   结果:['83', '40', '25']
 6 
 7 
 8 
 9 res = ret.search('sjkhk172按实际花费928')   找到从左到右的第一个数字172
10 print(res.group())
11 
12 
13 结果:172
compile的编译

 

2 finditer 节省你使用正则表达式解决问题的空间/内存

 1 import re
 2 ret=re.finditer('\d+','alex83taibai40egon25')
 3 for i in ret:       
 4      print(i.grounp())
 5 
 6 
 7 结果:
 8 83
 9 40
10 25
finditer


compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间

finditer 返回一个迭代器,所有非结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

 

3 分组在re模块中的使用

 1 import re
 2 s = '<a>wahaha</a>' 
 3 ret=re.search('<\w+)(\w+)</(\w+)>',s)
 4 print(ret.group())    显示所有的结果
 5 
 6 结果:<a>wahaha</a>
 7 
 8 
 9 print(ret.group(1))    数字参数代表的是取对应分组中的内容,取第一个分组中的内容
10 
11 结果:a
12 
13 print(ret.group(2))
14 
15 结果:wahaha
16 
17 
18 print(ret.group(3))
19 
20 结果:a
分组中的例子
 1 import re
 2 s = '<a>wahaha</a>'
 3 ret=re.findall('(\w+)',s)
 4 print(ret)
 5 
 6 结果:['a', 'wahaha', 'a']
 7 
 8 ret=re.findall('>(\w+)<',s)
 9 print(ret)
10 
11 
12 结果:wahaha
分组中的优先显示
1 import re
2 ret=re.findall('\d+\.\d+')?','1.234*4')
3 print(ret)
4 
5 结果:['.234', '']
取消分组优先(?:正则表达式
 1 ret=re.split('\d+','alex83taibai40egon25')
 2 print(ret)
 3 
 4 
 5 结果:['alex', 'taibai', 'egon', 'aa']
 6 
 7 
 8 
 9 ret=re.split('(\d+)','alex83taibai40egon25')   有分组
10 print(ret)
11 
12 结果:['alex', '83', 'taibai', '40', 'egon', '25', 'aa']
split中的分组与不分组区别

 

分组命名(?P<组名>正则表达式)

1 s = '<a>wahaha</a>'
2 ret=re.search('>(?P<vvv>\w+)<',s)
3 print(ret.group(1))
4 print(ret.group('vvv'))   可以通过组名来获取数据
5 
6 结果:wahaha
7        wahaha
分组命名
 1 s = '<a>wahaha</a>'
 2 m='<(\w+)>(\w+)<(\w+)>'
 3 ret=re.search(pattern.s)
 4 print(ret.group(1)==ret.group(3))
 5 
 6 结果:True
 7 
 8 
 9 
10 pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'   也可以用分组名来判断
11 ret = re.search(pattern,s)
12 print(ret)
13 
14 
15 结果:<_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>
判断两个元素是否一样

 

posted @ 2018-08-17 17:32  茉莉花M  阅读(144)  评论(0编辑  收藏  举报