Python基础(正则表达式与re模块)
正则表达式与re模块的应用方法:
1.1 应用:
用户输入信息的验证(注册页 登录页)
数据的提取(爬虫)
1.2 正则的三大查找方法:
参数说明 正则表达式 待匹配的字符串
# findall 方法: # 根据正则规则从一段内容中查找结果 import re ret = re.findall('\d+', 'aaa') print(ret) # 返回一个列表,找不到则返回一个空列表 # search 方法: # group()没有找到则会报错 import re ret = re.search('\d', 'alex123yuan234') # 只取第一个值 print(ret) # 返回结果集,找不到则为None # print(ret.group()) # match 方法: # 从第一个字符串开始找,第一个字符不满足条件则返回None # 类似 ^ + search 功能 # 返回结果集 import re ret = re.match('\d', 'alex123yuan234') print(ret) # 返回结果集,找不到则为None if ret: print(ret.group()) # 处理没有找到则会报错的情况 # match可以被替代么? 可以 re.search('^\d+','123alex') == re.match('\d+','123alex')
1.3 字符串的其他方法:
参数说明 正则 要换的结果 待匹配的字符串
# sub 方法: import re ret = re.sub('\d+', 'xxx', 'alex84wusir73') # 默认替换所有,找不到则返回原字符串 ret = re.sub('\d+', 'xxx', 'alex84wusir73', 1) # 指定替换次数 1次 print(ret) # subn 方法 # 以元组形式返回结果,返回替换个数 import re ret = re.subn('\d+', 'xxx', 'alex84wusir73') print(ret) # ('alexxxxwusirxxx', 2) # split 方法 分组可以保留切除的内容 import re ret = re.split('\d+', 'alex84wusir73yuan') # 切片,返回一个列表 ret1 = re.split('\d(\d)', 'alex84wusir73') # 末尾空字符情况 ret2 = re.split('(\d+)', 'alex84wusir73yuan') # 分组可以保留切除的字符串 分组优先显示 print(ret) # ['alex', 'wusir', 'yuan'] print(ret1) # ['alex', '4', 'wusir', '3', ''] print(ret2) # ['alex', '84', 'wusir', '73', 'yuan']
1.4 进阶方法:
1.4.1 compile 方法:
1.4.1.1 优点:
多次使用时正则表达式时只需要编译一次,节约编译时间
如果compile方法只执行一次不能节省时间,不能节省编译时间
compile + finditer:节省时间和内存空间
1.4.1.2re.compile 的方法与内置方法compile方法的区别:
re.compile 对正则表达式的规则进行预编译,提共编译的结果提供给re模块中的方法进行使用
内置方法compile: 对python表达式进行预编译,编译成电脑认识的机器码,增加执行效率
1.4.1.3 示例:
# compile 方法: import re par = re.compile('\d+') # 预编译 ret = par.findall('alex84wusir73') # 编译结果多次使用 ret1 = par.findall('xiao567') # 编译结果多次使用 ret2 = par.findall('3444span') # 编译结果多次使用 print(ret, ret1, ret2)
1.4.2 finditer 方法:
1.4.2.1 优点:
返回一个迭代器
节省内存空间
1.4.2.2 示例:
# finditer 方法: import re ret = re.finditer('\d', 'alex84alex84alex84alex84alex84alex84alex84alex84'*200) print(ret) # 生成一个迭代器 print(next(ret).group()) # 查看第一个结果 for i in ret: print(i.group()) # 结果集 通过group方法获取值
1.5 re模块中分组的概念:
1.5.1 分组在正则表达式中发挥的作用:
分组在findall当中默认会优先被显示出来
如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示
1.5.2 findall 与 分组:
# findall与分组: # 未做分组处理的结果: import re s = '<title>qqxing<\title>' ret = re.findall('>\w+<', s) print(ret[0].strip('<>')) # 通过strip方法切除多余字符 # 小示例: # 分组的优先显示原则: import re ret = re.findall('www.(baidu|python).com', 'www.python.com') ret2 = re.findall('www.(?:baidu|python).com', 'www.python.com') # 取消规则 print(ret) # ['python'] print(ret2) # ['www.python.com'] # 做分组处理: import re s = '<title>qqxing<\title>' ret = re.findall('>(\w+)<', s) # 分组永远优先显示分组中的内容 ret2 = re.findall('>(?:\w+)<', s) # 取消优先显示规则 print(ret) # ['qqxing'] print(ret2) # ['>qqxing<']
1.5.3 search 与 分组:
# search和分组: import re ret = re.search(r'<(\w+)>(\w+)<\\(\w+)>', r'<title>qqxing<\title>') print(ret.group(0)) # 不受到分组的影响,默认返回匹配的所有 print(ret.group(1)) # 分组1 title print(ret.group(2)) # 分组2 qqxing print(ret.group(3)) # 分组3 title
1.6 分组命名 与 引用 分组:
1.6.1 格式:
?P<组名>
引用分组(?P=组名)
1.6.2 示例:
# 分组命名: import re s = r'<title>qqxing<\title>' ret = re.search(r'<(?P<tab1>\w+)>(?P<content>\w+)<\\(\w+)>', s) # 分组命名 print(ret.group(0)) # 不受到分组的影响 print(ret.group('tab1')) # group('tab1') == group(1) print(ret.group('content')) # 通过组名拿到值 # 引用分组: import re s = '<h1>wahaha</h2></h1></h3>' ret = re.search('<(?P<tag>\w+)>.*</(?P=tag)>', s) # 引用分组 print(ret.group()) # 特殊方法引用: # 如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致 import re s = '<h1>wahaha</h2></h1></h3>' ret = re.search(r'<(\w+)>.*</\1>', s) # 特殊方法 print(ret.group())
1.7 综合小实例:
# 小示例: # 匹配整数示例: import re ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['1', '2', '60', '40', '35', '5', '4', '3'] ret = re.findall(r"-?\d+\.\d*|(-?\d+)", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['1', '-2', '60', '', '5', '-4', '3'] ret.remove("") # 除去空字符 print(ret) # ['1', '-2', '60', '5', '-4', '3'] # 匹配时间: # 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’ # 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、 # 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ # 匹配其他: # 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,} # 匹配一个浮点数。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d* # 匹配汉字。 ^[\u4e00-\u9fa5]{0,}$