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实现的数据结构与算法之链表详解
Apr 22 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
python中验证码连通域分割的方法详解
Jun 04 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
python try 异常处理(史上最全)
Mar 07 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
python 基于pygame实现俄罗斯方块
Mar 02 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中获取系统信息的方法
2013/06/25 PHP
php日历制作代码分享
2014/01/20 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python在线运行代码助手
2016/07/15 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
Python列表(List)知识点总结
2019/02/18 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
护理专业个人求职简历的自我评价
2013/10/13 职场文书
应聘美工求职信
2013/11/07 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
教育孩子心得体会
2014/01/01 职场文书
业务总经理岗位职责
2014/02/03 职场文书
安全标准化汇报材料
2014/02/03 职场文书
成语的广告词
2014/03/19 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
一起来学习Python的元组和列表
2022/03/13 Python