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魔法方法-属性访问控制详解
Jul 25 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
flask框架自定义url转换器操作详解
Jan 25 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
python中for in的用法详解
Apr 17 Python
Python devel安装失败问题解决方案
Jun 09 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
用python-webdriver实现自动填表的示例代码
Jan 13 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
模板引擎正则表达式调试小技巧
2011/07/20 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
学习PHP session的传递方式
2016/06/15 PHP
PHP查询分页的实现代码
2017/06/09 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
Python实现的检测网站挂马程序
2014/11/30 Python
Django发送html邮件的方法
2015/05/26 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
广告学毕业生求职信
2014/01/30 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
农业项目建议书
2014/08/25 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python