Python re模块与正则表达式的运用

re模块

永远不要起一个py文件的名字,这个名字和你已知的模块同名

 

查找

 

findall():     匹配所有   每一项都是列表中的一个元素

语法 :   findall(正则判断条件,要判断字符串)

返回值:  是一个列表

1 import re
2 ret = re.findall("\d+","dadqbwhebq26548dadwd151")  #
3 print(ret)
4 ret1 = re.findall("\d","dadqbwhebq26548dadwd151")
5 print(ret1)
6 
7 结果
8 ['26548', '151']
9 ['2', '6', '5', '4', '8', '1', '5', '1']

 

search():    只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过变量的group方法来获取结果

如果没有匹配到,会返回None,使用group会报错

语法:    search(正则表达式,待匹配字符)

返回值:  返回的是一个内存地址

 

 1 import re
 2 ret = re.search("\d+","dadqbwhebq26548dadwd151")
 3 print(ret)  # 打印的是内存地址
 4 print(ret.group())  #  用group获取真正的结果
 5 
 6 
 7 # 结果
 8 <_sre.SRE_Match object; span=(10, 15), match='26548'>
 9 26548
10 
11 # 因为查不到的时候用group会报错
12 # 一般都会这样写
13 ret = re.search("\d+","dadqbwhebqdadwd")
14 print(ret)  # 查不到返回None
15 if ret :  #  如果查不到就不会被执行
16     print(ret.group())
17 
18 # 结果
19 None

 

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

语法 : match(正则表达式,待匹配字符)

返回值 :  是一个内存地址

 1 import re
 2 ret = re.match("\d+","1321dajdd1615")
 3 print(ret)  #返回值是一个内存地址
 4 print(ret.group())
 5 
 6 
 7 结果
 8 <_sre.SRE_Match object; span=(0, 4), match='1321'>
 9 1321
10 
11 
12 
13 
14 ret1 = re.match("\d+","dajdd1615")
15 print(ret1)
16 if ret1:
17     print(ret1.group())
18 
19 结果
20 None

 

字符串的处理     切割  替换

 

split()    切割     与字符串一样的切割

1 import re
2 s = "dadwd1adwjkd54dwqd12315da0"
3 ret = re.split("\d+",s)
4 print(ret)
5 
6 结果
7 ['dadwd', 'adwjkd', 'dwqd', 'da', '']

 

sub   替换    和  replice()   一样

语法:   sub(正则判断,旧的,新的,次数)

 1 import re
 2 ret = re.sub("\d+","SB","dabbwqibd15dawn155dwjdn")
 3 print(ret)
 4 
 5 结果
 6 dabbwqibdSBdawnSBdwjdn
 7 
 8 ret = re.sub("\d+","SB","dabbwqibd15dawn155dwjdn",1)
 9 print(ret)
10 
11 结果
12 dabbwqibdSBdawn155dwjdn

 

subn()    替换   可以显示出替换了几次

语法:   subn(正则判断,旧的,新的)

返回值:  是一个元组,  第一项是结果 , 第二项是次数

import re
ret = re.subn("\d+","SB","dabbwqibd15dawn155dwjdn")
print(ret)

结果
('dabbwqibdSBdawnSBdwjdn', 2)

 

re模块的进阶   空间 / 时间

 

compile()      节省你使用正则表达式解决问题的时间

用途:  编译  ,    正则表达式  编译成字节码     再多次使用的过程中    不会被多次编译

 语法:   complic(正则表达式)

返回值 :   编译后的正则表达式的内存地址

ret = re.compile("\d+")
print(ret)
res = ret.findall("dwbahbfaj255dwafafdw12dwa")
print(res)
res1 = ret.search("dwbahbfaj255dwafafdw12dwa")
print(res1.group())
res2 = ret.split("dwbahbfaj255dwafafdw12dwa")
print(res2)
res3 = ret.finditer("dwbahbfaj255dwafafdw12dwa")
for i in res3:
    print(i.group())


结果
re.compile('\\d+')
['255', '12']
255
['dwbahbfaj', 'dwafafdw', 'dwa']
255
12

编译后的结果都可以与re模块中的函数使用

 

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

语法:  finditer(正则表达式,待匹配字符)

返回值:   返回一个可迭代对象的一个内存地址

ret = re.finditer("\d+","dwbahbfaj255dwafafdw12dwa")
for i in ret:
    print(i.group())

结果
255
12

 

 

分组在re模块中的使用      重点

格式:  优先级对 findall() 使用  如果正则表达式中有分组  (?:正则表达式)  取消优先级  ,

  分组对search序列标号提取要匹配的    或者对该分组命名  格式    (?P<name>)

  同时HTML格式提取还有这种  "<(?P<count>\w+)>(\w+)</(?P=count)>"   前面和后面可以判断必须一样

 

  

 1 s = '<a>wahaha</a>'  # 标签语言 html 网页
 2 ret = re.search(">(\w*)<",s)
 3 print(ret.group(1))
 4 ret = re.findall(">(\w*)<",s)  # 优先级
 5 print(ret)
 6 s1 = "515.64123165"
 7 ret2 = re.findall("\d+(?:.\d+)?",s1)  # 取消优先级
 8 print(ret2)
 9 
10 ret1 = re.search("<(\w+)>(\w+)</(\w+)>",s)  #可以根据分组的位置标号提取
11 print(ret1.group())
12 print(ret1.group(1))
13 print(ret1.group(2))
14 print(ret1.group(3))
15 
16 ret1 = re.search("<(?P<con>\w+)>(?P<con1>\w+)</(?P<con2>\w+)>",s)  # 可以根据分组的名字提取
17 print(ret1.group())
18 print(ret1.group('con'))
19 print(ret1.group('con1'))
20 print(ret1.group('con2'))
21 
22 s = '<a>wahaha</a>'
23 ret6 = re.search("<(?P<conu>\w+)>(\w+)</(?P=conu)>",s)
24 print(ret6.group())

 

 

 

posted @ 2018-08-17 19:31  heshun  阅读(277)  评论(0编辑  收藏  举报