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 11 Python
在Python中测试访问同一数据的竞争条件的方法
Apr 23 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
python的exec、eval使用分析
Dec 11 Python
Django admin美化插件suit使用示例
Dec 12 Python
实例介绍Python中整型
Feb 11 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
python实现飞机大战小游戏
Nov 08 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
解决pytorch 数据类型报错的问题
Mar 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
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python GUI编程完整示例
2019/04/04 Python
python argparser的具体使用
2019/11/10 Python
Python帮你识破双11的套路
2019/11/11 Python
Django 自动生成api接口文档教程
2019/11/19 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
质检员岗位职责
2013/12/17 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript