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两种遍历字典(dict)的方法比较
May 29 Python
Python中atexit模块的基本使用示例
Jul 08 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
python WindowsError的错误代码详解
Jul 23 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
对python生成业务报表的实例详解
Feb 03 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
使用Python实现画一个中国地图
Nov 23 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 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 SQL Injection with MySQL
2011/02/27 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
vue实现文字加密功能
2019/09/27 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
python list转dict示例分享
2014/01/28 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Tensorflow累加的实现案例
2020/02/05 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
Java基础知识面试题
2014/03/25 面试题
学生档案自我鉴定
2013/10/07 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
2015年环保局工作总结
2015/05/22 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
python 爬取天气网卫星图片
2021/06/07 Python
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python