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 27 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
Python卸载模块的方法汇总
Jun 07 Python
Python匿名函数及应用示例
Apr 09 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Python 调用 Windows API COM 新法
Aug 22 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
如何基于Python按行合并两个txt
Nov 03 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
DSP接收机前端设想
2021/03/02 无线电
使用phpQuery采集网页的方法
2013/11/13 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php注册登录系统简化版
2020/12/28 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python中dict()的高级用法实现
2019/11/13 Python
python求前n个阶乘的和实例
2020/04/02 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
服装公司总经理岗位职责
2013/11/30 职场文书
《童趣》教学反思
2014/02/19 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
个人融资协议书
2014/10/02 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
草房子读书笔记
2015/06/29 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
MYSQL常用函数介绍
2022/05/05 MySQL