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 实现文件的全备份和差异备份详解
Dec 27 Python
Python3 queue队列模块详细介绍
Jan 05 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
python中pip的安装与使用教程
Aug 10 Python
用Python实现读写锁的示例代码
Nov 05 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
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的memory_limit限制的方法分享
2012/02/21 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python and、or以及and-or语法总结
2015/04/14 Python
详解Django中的form库的使用
2015/07/18 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
python破解zip加密文件的方法
2018/05/31 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
详解django中使用定时任务的方法
2018/09/27 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
满月酒答谢词
2014/01/14 职场文书
安全责任协议书
2014/04/21 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
个人政治思想总结
2015/03/05 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
舞出我人生观后感
2015/06/16 职场文书
婚宴致辞
2015/07/28 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS