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解决字典中的值是列表问题的方法
Mar 04 Python
Python自定义函数的创建、调用和函数的参数详解
Mar 11 Python
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
Python map和reduce函数用法示例
Feb 26 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
python实现简单日期工具类
Apr 24 Python
Python Django的安装配置教程图文详解
Jul 17 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
Python安装并操作redis实现流程详解
Oct 13 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导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
8个PHP数组面试题
2015/06/23 PHP
Yii中表单用法实例详解
2016/01/05 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
node 命令方式启动修改端口的方法
2018/05/12 Javascript
python插入数据到列表的方法
2015/04/30 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
经典爱情感言
2015/08/03 职场文书