Python中请不要再用re.compile了


Posted in Python onJune 30, 2019

前言

如果大家在网上搜索Python 正则表达式,你将会看到大量的垃圾文章会这样写代码:

import re

pattern = re.compile('正则表达式')
text = '一段字符串'
result = pattern.findall(text)

这些文章的作者,可能是被其他语言的坏习惯影响了,也可能是被其他垃圾文章误导了,不假思索拿来就用。

在Python里面,真的不需要使用re.compile!

为了证明这一点,我们来看Python的源代码。

在PyCharm里面输入:

import re

re.search

然后Windows用户按住键盘上的Ctrl键,鼠标左键点击search,Mac用户按住键盘上的Command键,鼠标左键点击search,PyCharm会自动跳转到Python的re模块。在这里,你会看到我们常用的正则表达式方法,无论是findall还是search还是sub还是match,全部都是这样写的:

_compile(pattern, flag).对应的方法(string)

例如:

def findall(pattern, string, flags=0):
 """Return a list of all non-overlapping matches in the string.

 If one or more capturing groups are present in the pattern, return
 a list of groups; this will be a list of tuples if the pattern
 has more than one group.

 Empty matches are included in the result."""
 return _compile(pattern, flags).findall(string)

如下图所示:

Python中请不要再用re.compile了

然后我们再来看compile:

def compile(pattern, flags=0):
 "Compile a regular expression pattern, returning a Pattern object."
 return _compile(pattern, flags)

如下图所示:

Python中请不要再用re.compile了

看出问题来了吗?

我们常用的正则表达式方法,都已经自带了compile了!

根本没有必要多此一举先re.compile再调用正则表达式方法。

此时,可能会有人反驳:

如果我有一百万条字符串,使用使用某一个正则表达式去匹配,那么我可以这样写代码:

texts = [包含一百万个字符串的列表]
pattern = re.compile('正则表达式')
for text in texts:
 pattern.search(text)

这个时候,re.compile只执行了1次,而如果你像下面这样写代码:

texts = [包含一百万个字符串的列表]
for text in texts:
 re.search('正则表达式', text)

相当于你在底层对同一个正则表达式执行了100万次re.compile。

Talk is cheap, show me the code.

我们来看源代码,正则表达式re.compile调用的是_compile,我们就去看_compile的源代码,如下图所示:

红框中的代码,说明了_compile自带缓存。它会自动储存最多512条由type(pattern), pattern, flags)组成的Key,只要是同一个正则表达式,同一个flag,那么调用两次_compile时,第二次会直接读取缓存。

综上所述,请你不要再手动调用re.compile了,这是从其他语言(对的,我说的就是Java)带过来的陋习。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中encode()方法的使用简介
May 18 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Python 加密的实例详解
Oct 09 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
使用pandas读取文件的实现
Jul 31 Python
Python魔法方法 容器部方法详解
Jan 02 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Numpy数组的广播机制的实现
Nov 03 Python
Python排序函数的使用方法详解
Dec 11 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
用python求一个数组的和与平均值的实现方法
Jun 29 #Python
Python:Numpy 求平均向量的实例
Jun 29 #Python
python 计算数据偏差和峰度的方法
Jun 29 #Python
Python求均值,方差,标准差的实例
Jun 29 #Python
python 计算平均平方误差(MSE)的实例
Jun 29 #Python
Python变量访问权限控制详解
Jun 29 #Python
python pandas生成时间列表
Jun 29 #Python
You might like
PHP原理之异常机制深入分析
2010/08/08 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
jquery中对表单的基本操作代码
2010/07/29 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
js分页工具实例
2015/01/28 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
Python实现简单遗传算法(SGA)
2018/01/29 Python
python os.fork() 循环输出方法
2019/08/08 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
python实现ping命令小程序
2020/12/28 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
优秀应届生求职信
2014/06/16 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
初中数学教学随笔
2015/08/15 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL
redis protocol通信协议及使用详解
2022/07/15 Redis