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函数参数*args**kwargs用法实例
Dec 04 Python
python连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
Python数据结构之Array用法实例
Oct 09 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
Python实现位图分割的效果
Nov 20 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中读取和写入WORD文档的代码
2008/04/09 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
Python面向对象之继承代码详解
2018/01/29 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
django实现用户注册实例讲解
2019/10/30 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
学校门卫工作职责
2013/12/07 职场文书
人事专员职责
2014/02/22 职场文书
篝火晚会主持词
2014/03/25 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
大学生见习总结报告
2015/06/24 职场文书
回复函格式及范文
2015/07/14 职场文书
python中对列表的删除和添加方法详解
2022/02/24 Python