re模块
1. 匹配常用方法
(1) findall
返回值:列表:列表中是所有匹配到的项
import reret = re.findall('a','eva egon yuan') #['a', 'a']print(ret)ret = re.findall('[a-z]+','eva egon yuan') #['eva', 'egon', 'yuan']print(ret)
(2) search
ret = search('\d(\w)+','bdsjdbc14564fvfv')
ret = search('\d(?P<name>\w)+','bdsjdbc14564fvfv') #给分组命名为name
找整个字符串,遇到匹配上的就返回,遇不到就返回None
如果有返回值,ret.group()就可以取到值
取分组中的内容:ret.group(1) #按照组的顺序(从第一个开始)
ret.group('name') #按照组的名字
import reret = re.search('a','eva egon yuan')print(ret) #<_sre.SRE_Match object; span=(2, 3), match='a'>print(ret.group()) #a
import re# 报错:如果没有找到结果,那么返回None,调用group会报错# ret = re.search('m','eva egon yuan')# print(ret) #None# print(ret.group()) #AttributeError: 'NoneType' object has no attribute 'group'# 使用下面方法不报错# (1) 找到结果ret = re.search('a','eva egon yuan')if ret: print(ret.group()) #a# (2) 没有找到结果ret = re.search('m','eva egon yuan')if ret: print(ret.group()) #无任何结果,也不报错
(3) match
从头开始匹配,匹配上就返回,匹配不上就返回None
匹配上:ret.group()取值
import re# 如果正则规则从头开始可以匹配上,则返回一个变量,调用group显示# 如果没匹配上,就返回None,调用group会报错ret = re.match('[a-z]+','eva egon yuan')if ret: print(ret.group()) #eva
2. 其他常用方法
(1) 分割 split
import re# 先按照'a'分割得到''和'bcd',再对''和'bcd'分别按照'b'分割ret = re.split('[ab]','abcd')print(ret) #['', '', 'cd']
(2) 替换 sub subn
import re# 将数字替换成'H',参数1表示替换一次ret = re.sub('\d','H','eva3egon4yuan4',1)print(ret) #evaHegon4yuan4
import re# subn# 将数字替换成'H',返回替换结果和替换次数ret = re.subn('\d','H','eva3egon4yuan4')print(ret) #('evaHegonHyuanH', 3)
(3) 返回迭代器 finditer
返回很多值,不想让它们一次性全部出现在内存里
import re# 返回一个存放匹配结果的迭代器ret = re.finditer('\d','ds3sy4764384a')print(ret) ## 查看第一个结果print(next(ret).group()) #3# 查看第二个结果print(next(ret).group()) #4# 查看剩余的所有结果print([i.group() for i in ret]) #['7', '6', '4', '3', '8', '4']# 查看所有匹配结果:循环打印其中的数字ret = re.finditer('\d','ds3sy4764384a')for i in ret: print(i.group()) # 3 4 6 7 3 8 4
(4) 编译 compile
正则表达式很长且要多次使用
import re# 将正则表达式编译成一个正则表达式对象obj = re.compile('\d{3}') #此规则要匹配3个数字ret = obj.search('abc123eeee')print(ret.group()) #123ret = obj.search('412e')print(ret.group()) #412ret = obj.search('abgfnjgn78967ee')print(ret.group()) #789
3. 分组优先
(1)findall的优先级查询——?:
import reret = re.findall('www.(baidu|oldboy).com','www.oldboy.com')print(ret) #['oldboy']# ?:——取消分组优先ret = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')print(ret) #['www.oldboy.com']
(2)split的优先级查询——()
import reret = re.split("\d+","eva3egon4yuan")print(ret) #['eva', 'egon', 'yuan']# 加()——取消分组优先ret = re.split("(\d+)","eva3egon4yuan")print(ret) #['eva', '3', 'egon', '4', 'yuan']