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多进程编程技术实例分析
Sep 16 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python中获取网页状态码的两个方法
Nov 03 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 Python
python语言是免费还是收费的?
Jun 15 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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
PHP7常量数组用法分析
2016/09/26 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
JavaScript国旗变换效果代码
2008/08/13 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
cookie的secure属性详解
2015/04/08 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
学习自我鉴定
2014/02/01 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
公司人事任命通知
2015/04/20 职场文书
消防宣传语大全
2015/07/13 职场文书
办公室卫生管理制度
2015/08/04 职场文书
九年级化学教学反思
2016/02/22 职场文书