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中的装饰器详解
Apr 13 Python
Python中super的用法实例
May 28 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
对于Python装饰器使用的一些建议
Jun 03 Python
深入理解Python中的内置常量
May 20 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
详解python中的数据类型和控制流
Aug 08 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
Python实现弹球小游戏
Aug 01 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
人族 TERRAN 概述
2020/03/14 星际争霸
输出控制类
2006/10/09 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python 多线程实例详解
2017/03/25 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
Django 返回json数据的实现示例
2020/03/05 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
大学生自荐信
2013/12/11 职场文书
自我评价的写作规则
2014/01/06 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
学校清明节活动总结
2014/07/04 职场文书
学校运动会简讯
2015/07/20 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
Mysql数据库命令大全
2021/05/26 MySQL