更新:

从知乎和stackoverflow的讨论看

https://zhuanlan.zhihu.com/p/70680488

https://stackoverflow.com/questions/452104/is-it-worth-using-pythons-re-compile

实际性能差异根本感知不到,而re.compile可以提高可读性,更通用一些。

-----------------------

转载自:https://blog.csdn.net/pyjishu/article/details/105413660

如果大家在网上搜索 Python正则表达式,你将会看到大量的垃圾文章会这样写代码:

 
  1. import re

  2. pattern = re.compile('正则表达式')

  3. text = '一段字符串'

  4. result = pattern.findall(text)

这些文章的作者,可能是被其他语言的坏习惯影响了,也可能是被其他垃圾文章误导了,不假思索拿来就用。

在Python里面,真的不需要使用re.compile!

为了证明这一点,我们来看Python的源代码。

在PyCharm里面输入:

 
  1. import re

  2. re.search

然后Windows用户按住键盘上的Ctrl键,鼠标左键点击 search,Mac用户按住键盘上的Command键,鼠标左键点击 search,PyCharm会自动跳转到Python的re模块。在这里,你会看到我们常用的正则表达式方法,无论是 findall还是 search还是 sub还是 match,全部都是这样写的:

_compile(pattern, flag).对应的方法(string)

例如:

 
  1. def findall(pattern, string, flags=0):

  2. """Return a list of all non-overlapping matches in the string.

  3. If one or more capturing groups are present in the pattern, return

  4. a list of groups; this will be a list of tuples if the pattern

  5. has more than one group.

  6. Empty matches are included in the result."""

  7. return _compile(pattern, flags).findall(string)

如下图所示:

然后我们再来看 compile

 
  1. def compile(pattern, flags=0):

  2. "Compile a regular expression pattern, returning a Pattern object."

  3. return _compile(pattern, flags)

如下图所示:

看出问题来了吗?

我们常用的正则表达式方法,都已经自带了 compile了!

根本没有必要多此一举先 re.compile再调用正则表达式方法。

此时,可能会有人反驳:

如果我有一百万条字符串,使用某一个正则表达式去匹配,那么我可以这样写代码:

 
  1. texts = [包含一百万个字符串的列表]

  2. pattern = re.compile('正则表达式')

  3. for text in texts:

  4. pattern.search(text)

这个时候, re.compile只执行了1次,而如果你像下面这样写代码:

 
  1. texts = [包含一百万个字符串的列表]

  2. for text in texts:

  3. 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)带过来的陋习。

即:-------

List=re.findall(r'正则表达式',txt)

等价于
pattern=re.compile(r'正则表达式')
List=pattern.findall(txt)

-----------------------------------------

请不要再用re.compile了!!!相关推荐

  1. Python中请不要再用re.compile了

    这篇文章主要给大家介绍了关于Python中为何不要再用re.compile的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学 ...

  2. telnet时显示:允许更多到 telnet 服务器的连接。请稍候再试

    telnet时显示:允许更多到 telnet 服务器的连接.请稍候再试  解决办法: windows自带telnet服务器默认的最大连接数为2,要想修改该设置,可以在命令行键入tlntadmn con ...

  3. 倒排索引原理_拜托,面试请不要再问我分布式搜索引擎的架构原理!

    欢迎关注头条号:石杉的架构笔记 周一至周五早八点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 目录 (1)倒排索引到底是啥? (2)什么叫分布式搜索引擎? (3)ElasticSea ...

  4. 新浪博客“网络繁忙请稍后再试”

    发博文提示网络繁忙请稍后再试 August 17 摘要:经常用新浪博客发博文的人应该会遇到一个问题,那就是有时会提示网络繁忙请稍后再试,同时连保存草稿也不行,这时候该怎么办呢? 方法/步骤 我们假定真 ...

  5. android的支付宝sdk 提示系统繁忙 请稍后再试_《活动运营中防系统扑街指南》

    以下文章来源于姬小光 ,作者姬小光 那么常见的活动扑街都有哪些表现呢? 通常,按照技术的专业术语来讲,有 40x 及 50x 系列. 我们在网站上经常能见到的,就是类似 "404 页面找不到 ...

  6. 请别再拿“String s = new String(xyz);创建了多少个String实例”来面试了吧---转

    http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的.  本来因为见得太 ...

  7. 微擎任意消息该公众号提供的服务器,该公众号提供的服务出现故障,请稍后再试...

    image.png 用户发送消息给公众号时,假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复) ...

  8. SQL Server 数据库 'xxx' 正处于转换状态。请稍后再尝试该语句。

    问题是这样的,最近因义务需要,公司更换了数据库服务器.数据库随之切换到新的服务器上. 服务器是 Windows Server 2012系统,数据库是SQL Server 2012 .上面有 多个数据库 ...

  9. TIM提示“个人文件夹被占用,请稍候再登录”怎么解决

    在登录TIM的时候,弹出提示"个人文件夹被占用,请稍后再登录"的提示,无法正常登录TIM TIM提示"个人文件夹被占用,请稍候再登录"怎么解决? 这个时候,我们 ...

最新文章

  1. 华人小哥用苹果音箱「隔空」测心律,论文登上Nature子刊
  2. 每日一皮:据说这是很多公司的办事流程
  3. 【C++】Visual studio样式定制
  4. 史上最详细 DevC++无法运行正则表达式
  5. [Android] TextView 分页功能的实现
  6. linux使用命令配置网络,使用nmcli命令配置网络
  7. orb-slam a versatile and accurate monocular slam system
  8. 坚果pro2 android 8,手机 篇一:坚果Pro2特别版使用感受
  9. electron入门笔记(三)- 引入bootstrap
  10. ctf 选择题 题库_看雪CTF题库平台 | 赛练结合,助你夺冠!
  11. 美团外卖广告投放系统的设计
  12. 学习 Tornado
  13. 有关excel中宏的使用问题
  14. C语言读书1000字报告,c语言实验一实验报告1000字范文.docx
  15. 【攻防世界 level2】
  16. STM32L4系列单片机的低功耗问题
  17. hibernate mysql 整合_Spring+SpringMVC+Hibernate整合笔记(一)项目结构与配置
  18. 无需洪荒之力,轻松搞定奥运会奖牌榜
  19. 有一段英文文本 ,其中有单词连续重复了 2 次 ,编写程序检查重复的单词并只保留一个 。例如 ,文本内容为 This is is a desk.””,程序输出为 This is a desk。
  20. Python学习2,拆分plist图集,还原成小图

热门文章

  1. BZOJ 3527 [Zjoi2014] 力
  2. 阿里云存储收费太坑了
  3. 普通人的普通生活真的不普通
  4. PR视效素材包 PR视频调色LUTs光效迭加视频素材
  5. JAVA String的常见用法
  6. shell 中的三种引号的作用
  7. 初级会计问答5.11
  8. 制作initrd.img
  9. Mongdb篇三。 用Python代码实现Mongdb数据库的增删查改、集合管道示例,超详细,全部用实例print大法演示功能通俗易懂。学pymongo库看一篇就够
  10. IOS之如何把自己开发的App安装到越狱的手机