Python中请不要再用re.compile了

作者:青南 时间:2021-08-30 23:57:51 

前言

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

来源:https://juejin.im/post/5d144231f265da1bb67a2a29

标签:python,re.compile
0
投稿

猜你喜欢

  • Django 通过JS实现ajax过程详解

    2023-08-17 08:00:46
  • python实现监控linux性能及进程消耗性能的方法

    2021-10-20 03:27:56
  • Python使用matplotlib绘制三维参数曲线操作示例

    2021-03-30 05:55:31
  • python列表元素拼接成字符串的4种方法

    2021-10-02 23:59:59
  • Python用yield from实现异步协程爬虫的实践

    2023-10-23 13:30:46
  • Python中hash加密简介及使用方法

    2022-08-16 01:06:06
  • python绘制超炫酷动态Julia集示例

    2023-10-04 12:58:49
  • Python面向对象类的继承实例详解

    2023-04-19 11:06:38
  • asp中的on error resume next用法

    2008-03-09 15:22:00
  • python调用pyaudio使用麦克风录制wav声音文件的教程

    2023-12-16 13:32:15
  • XAMPP和Mysql共存的方法

    2010-12-03 16:34:00
  • 8大措施帮你构筑Access安全防线

    2010-03-11 14:38:00
  • 详细解读Python中的__init__()方法

    2023-03-25 17:10:27
  • ActionScript3.0是革命性的

    2008-05-01 12:36:00
  • 使用Python写一个贪吃蛇游戏实例代码

    2023-07-05 18:25:02
  • python中matplotlib的颜色以及形状实例详解

    2021-06-30 23:04:35
  • python装饰器底层原理详解

    2021-12-31 08:48:32
  • Python脚本修改阿里云的访问控制列表的方法

    2022-06-19 10:31:18
  • Python双端队列deque的实现

    2022-07-07 02:37:29
  • python numpy矩阵信息说明,shape,size,dtype

    2021-02-21 17:52:47
  • asp之家 网络编程 m.aspxhome.com