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并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
python中的二维列表实例详解
Jun 19 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
python输入错误后删除的方法
Oct 12 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
Python闭包的定义和使用方法
Apr 11 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 pki加密技术(openssl)详解
2013/07/01 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
微信小程序联网请求的轮播图
2017/07/07 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
横向对比分析Python解析XML的四种方式
2016/03/30 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
Python封装原理与实现方法详解
2018/08/28 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
师德师风建设方案
2014/05/08 职场文书
文明之星事迹材料
2014/05/09 职场文书
运输公司工作总结
2015/08/11 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技