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 cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
python基础教程项目三之万能的XML
Apr 02 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
Python基于property实现类的特性操作示例
Jun 15 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
python程序如何进行保存
Jul 03 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
pytorch--之halfTensor的使用详解
May 24 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
小程序登录态管理的方法示例
2018/11/13 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
园林施工员岗位职责
2013/12/11 职场文书
中国梦的演讲稿
2014/01/08 职场文书
策划创业计划书
2014/02/06 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
食品安全汇报材料
2014/08/18 职场文书
销售2014年度工作总结
2014/12/08 职场文书
婚宴邀请函
2015/01/30 职场文书
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技