re模块
1. 匹配常用方法
(1) findall
返回值:列表:列表中是所有匹配到的项
import re ret = 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 re ret = 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) #<callable_iterator object at 0x0000013D05E83198> # 查看第一个结果 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()) #123 ret = obj.search('412e') print(ret.group()) #412 ret = obj.search('abgfnjgn78967ee') print(ret.group()) #789
3. 分组优先
(1)findall的优先级查询——?:
import re ret = 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 re ret = re.split("d+","eva3egon4yuan") print(ret) #['eva', 'egon', 'yuan'] # 加()——取消分组优先 ret = re.split("(d+)","eva3egon4yuan") print(ret) #['eva', '3', 'egon', '4', 'yuan']