Python中请不要再用re.compile了

 更新时间:2019年06月30日 10:51:05   作者:青南  
这篇文章主要给大家介绍了关于Python中为何不要再用re.compile的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

如果大家在网上搜索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)带过来的陋习。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 利用python进行数据加载

    利用python进行数据加载

    今天给大家带来的是关于Python的相关知识,文章围绕着python数据加载展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • pandas求行最大值及其索引的实现

    pandas求行最大值及其索引的实现

    工作需要,查询某一行中的最大值及其索引,本文主要介绍了pandas求行最大值及其索引的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • python3 pillow模块实现简单验证码

    python3 pillow模块实现简单验证码

    这篇文章主要为大家详细介绍了python3 pillow模块实现简单验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Pytorch中Softmax与LogSigmoid的对比分析

    Pytorch中Softmax与LogSigmoid的对比分析

    这篇文章主要介绍了Pytorch中Softmax与LogSigmoid的对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python常用Web框架Django、Flask与Tornado介绍

    Python常用Web框架Django、Flask与Tornado介绍

    这篇文章介绍了Python常用Web框架Django、Flask与Tornado,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 对python实时得到鼠标位置的示例讲解

    对python实时得到鼠标位置的示例讲解

    今天小编就为大家分享一篇对python实时得到鼠标位置的示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 详解在SpringBoot如何优雅的使用多线程

    详解在SpringBoot如何优雅的使用多线程

    这篇文章主要带大家快速了解一下@Async注解的用法,包括异步方法无返回值、有返回值,最后总结了@Async注解失效的几个坑,感兴趣的小伙伴可以了解一下
    2023-02-02
  • python掌握字符串只需这一篇就够了

    python掌握字符串只需这一篇就够了

    字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。创建字符串很简单,只要为变量分配一个值即可
    2021-11-11
  • Python实现定时精度可调节的定时器

    Python实现定时精度可调节的定时器

    这篇文章主要为大家详细介绍了Python实现定时精度可调节的定时器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python3 合并二叉树的实现

    Python3 合并二叉树的实现

    这篇文章主要介绍了Python3 合并二叉树的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论