一日一技:请不要再用re.compile了!!!

简介: 一日一技:请不要再用re.compile了!!!

如果大家在网上搜索 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)

如下图所示:

然后我们再来看 compile

def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a Pattern object."
    return _compile(pattern, flags)

如下图所示:

看出问题来了吗?

我们常用的正则表达式方法,都已经自带了 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)带过来的陋习。

目录
相关文章
|
7月前
|
Python
|
8月前
C/C++test两步完成CMake项目静态分析
通过将C/C++test集成到CMake项目中,并根据项目的需要进行配置,可以在两步内完成CMake项目的静态分析。这样可以帮助开发人员及时发现并修复潜在的代码问题,提高代码质量和可靠性。
85 0
|
机器学习/深度学习 JSON 数据格式
YOLOv5源码逐行超详细注释与解读(4)——验证部分val(test).py
YOLOv5源码逐行超详细注释与解读(4)——验证部分val(test).py
1887 1
|
存储 自然语言处理 编译器
编译链接(Compile Link)
编译链接(Compile Link)
166 0
|
编译器 开发工具 Windows
VS2008 未找到编译器可执行文件 csc.exe【当网上其他方法试玩了之后不起作用的时候再用这个方法】
被公司派遣到中国海洋石油惠州炼化公司做项目,做的是生产管理,来了发现他们的项目结构简直烂的要命,和同学们写的毕业设计差不多,然后开发工具用的是vs2008,我电脑是安装了vs2005和vs2010,vs2012就是没有安装vs2008,在安装vs2008的时候那是一番折腾好长时间,然后把vs2008安装好了打开项目代码,生成解决方案发现报了好多错,然后一一解决,最奇怪的是VS2008 未找到编译器可执行文件 csc.exe,我把所以路径都配好了,并且在dos环境下执行csc.exe都可以执行,环境变量路径设置的也么有问题,就是很奇怪重启机子打开项目还是找不到csc.exe
202 0
|
缓存 NoSQL Java
回《驳 <Python正则表达式,请不要再用re.compile了!!!>》
回《驳 <Python正则表达式,请不要再用re.compile了!!!>》
95 0
|
机器学习/深度学习 数据采集 搜索推荐
training.py的代码解释
labels、test_loss_op 和 mae_ops 计算模型的性能指标。最后,我们输出当前 epoch 的训练损失、测试损失和平均绝对误差(MAE),并保存模型参数(如果 MAE 小于 0.9)。 整个代码的目的是使用协同过滤算法建立电影推荐系统的模型,训练模型并计算模型的性能指标。
125 0
|
应用服务中间件
TeaVM的samples/benchmark范例运行办法
TeaVM的samples/benchmark范例运行办法
125 0
TeaVM的samples/benchmark范例运行办法
|
数据可视化 PyTorch 算法框架/工具
loss放在GPU上面的,现在我需要将loss的值放在visdom上面画出来,怎么处理?
在这个例子中,我们首先初始化了Visdom客户端。接下来,我们假设loss值已经在GPU上计算,并将其定义为torch张量。然后,我们使用.cpu()方法将loss从GPU设备移动到CPU,并使用.detach()方法分离出其计算图依赖关系,并将其转换为NumPy数组。最后,我们使用Visdom的vis.line()方法绘制loss曲线。其中,X表示横坐标,Y表示纵坐标,win指定窗口名称,name指定曲线名称,update指定更新模式(‘append’表示追加数据)。
310 0
编译doubango时,ffmpeg先用 2.8.15,再用4.2.2
编译doubango时,ffmpeg先用 2.8.15,再用4.2.2
114 0