正则表达式和re模块
正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则。
常用匹配模式(元字符)
re模块
re模块的四个功能:
findall() 查找多有结果 返回一个列表
fanditer() 查找到的结果返回一个迭代器
search() 查找 如果找到第一个结果就停止. 找不到结果返回None
match() 匹配 从开头找
import re # 1. findall 查找所有的结果 # 语法:第一个参数是'正则表达式',第二个参数是要匹配的'字符串' lst = re.findall('\d','侯明巍1993年3月23日出生.') print(lst) # ['1', '9', '9', '3', '3', '2', '3']
# 2. finditer 查找带的结果返回一个迭代器 # 语法:第一个参数是'正则表达式',第二个参数是要匹配的'字符串' it = re.finditer('\d','侯明巍1993年3月23日出生.') print(it) # <callable_iterator object at 0x000001A94FB59438> for el in it: print(el.group()) # 通过.group()获取结果 # 输出结果: # 1 # 9 # 9 # 3 # 3 # 2 # 3
# 3. search() 查找 只找一个结果,找到就停止,找不到返回None # 语法:第一个参数是'正则表达式',第二个参数是要匹配的'字符串' ret = re.search('\d','侯明巍1993年3月23日出生.') print(ret.group()) # 通过.group()获取结果 # 输出结果: # 1 # 4.match() 匹配 只从开头找,开头不符合就报错 # 语法:第一个参数是'正则表达式',第二个参数是要匹配的'字符串' ret = re.match('\d','侯明巍1993年3月23日出生.') print(ret) # 输出结果: # None # 如果有结果就通过.group()获取结果
import re # split 切割 切割完是一个列表 # 语法:第一个参数是'正则表达式',第二个参数是要切割的'字符串' lst = re.split('\d','侯明巍1993年3月23日出生.') print(lst) # ['侯明巍', '', '', '', '年', '月', '', '日出生.'] lst = re.split('\d','侯明巍1993年3月23日出生.',1) # 最后的'1'是切割的次数 print(lst) # ['侯明巍', '993年3月23日出生.'] # sub 替换 # 语法:第一个参数是'正则表达式',第二个参数是要替换成的'内容',第三个参数是要替换的'字符串' ret = re.sub('\d','某','侯明巍1993年3月23日出生.') print(ret) # 侯明巍某某某某年某月某某日出生. ret = re.sub('\d','某','侯明巍1993年3月23日出生.',1) # 最后的'1'是替换的次数 print(ret) # 侯明巍某993年3月23日出生. # subn 同sub 返回一个元组,第二个元素是替换的次数 res = re.subn('\d','某','侯明巍1993年3月23日出生.') print(res) # ('侯明巍某某某某年某月某某日出生.', 7) # re模块的进阶: 时间/空间 # compile() 节省使用正则表达式解决问题的时间 # finditer() 节省空间 # 编译正则表达式: 编译成字节码 ret = re.compile('\d') res = ret.findall('侯明巍1993年3月23日出生.') print(res) # ['1', '9', '9', '3', '3', '2', '3'] res = ret.search('侯明巍1993年3月23日出生') print(res.group()) # 1
import re set = '<a>娃哈哈</a>' # 语言标签 ret = re.search('<(\w+)>(\w+)</(\w+)>',set) print(ret.group()) # 默认参数0 获取所有的结果 print(ret.group(1)) print(ret.group(2)) print(ret.group(3)) # <a>娃哈哈</a> # a # 娃哈哈 # a # 为了findall可以顺利获取带分组中的内容,有一个特殊的语法,就是优先显示分组中的内容 ret = re.findall('>\w+<',set) print(ret) # ['>娃哈哈<'] ret = re.findall('>(\w+)<',set) print(ret) # ['娃哈哈'] # 取消分组优先: (?:正则表达式) s = '3.1415926*3.14' ret = re.findall('\d+(\.\d+)?',s) print(ret) # ['.1415926', '.14'] ret = re.findall('\d+(?:\.\d+)?',s) print(ret) # ['1.234', '4.3'] # 关于分组 # 对于正则表达式来说 有些时候我们需要进行分组,来整体约束某一字符串出现的次数 # 对于python语言来说 分组可以帮助更好更精确的找到真正需要的内容 s = '侯明巍1993年3月23日出生.' ret = re.split('(\d+)',s) # 分组可以把切掉的内容也显示出来 print(ret) # ['侯明巍', '1993', '年', '3', '月', '23', '日出生.'] # 分组命名 语法:(?P:<名字>正则表达式) s = '<a>娃哈哈</a>' ret = re.search('>(?P<con>\w+)<',s) print(ret.group(1)) print(ret.group('con')) # 娃哈哈 # 娃哈哈 # 使用前面的分组 要求被使用的这个名字的分组里的内容和前面同名分组中的内容匹配的必须一致 pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' ret = re.search(pattern,s) print(ret.group()) # <a>娃哈哈</a>