Python 正则 re.compile 真的必需吗
作者:笑笑布丁 发布时间:2021-12-27 17:12:24
背景:我在爬虫处理某个文本时,用到了re.findall(),而不是re.compile。远在新加坡的同事提出了质疑,认为以我的水平,不应该写出这样影响性能的代码,让我优化一下。我提出了反驳:既然使用了Python,就不应该太过考虑性能的问题,如果要考虑性能就使用C语言,而不是Python.他接着说:正是因为python性能不够,所以更应该考虑代码的优化,能做好就应该做到最好.最后,我没有回话,当然我也没有进行所谓的优化,以下我会给出我自己的观点.
re.compile()、re.findall()、re.search() 的作用与区别
1、re.compile()
Python里的re是支持正则表达式的模块,所谓的正则表达式就是匹配文本里符合条件的语句. re.compile()是根据包含正则表达式的字符串创建模式对象,以提高匹配效率.例如:
def test():
regex = r'(\d+) years old'
content = 'Alex is a 7 years old boy.'
reg = re.compile(regex)
result = re.search(reg, content).group()
print(result)
result = 7
2、re.search()
re.search()是在字符串开启查找模式,如其名:search.例如:
def test():
content = 'Alex is a 7 years old boy.'
result = re.search(r'(\d+) years old', content).group()
print(result)
result = 7
3、re.findall()
re.findall()是返回一个列表,列表里包含了所有符合条件的结果,例如:
def test():
content = 'Alex is a 7 years old boy.Bob is a 12 years old boy...'
result = re.findall(r'(\d+) years old', content)
print(result)
result = ['7', '12']
我们分歧在他认为我应该先用 re.complile 编译好正则之后,再匹配,正如我在re.compile举得例子. 你会说他说的没错啊,作者不应该顺从同事这个合理的要求,不改就算了还要在这里发文BB.我想说的是 抛开剂量谈毒性,都是耍流氓。对于数据来说抛开量级谈性能差异,都是耍流氓. 如果要处理的 文本是百万、千万、亿这个级别,我会做优化,但是对于个别刚上万的数据来说,我觉得没必要,业务流程真的不缺那0.0X秒,多写一行re.compile的时间远大于提示的时间了. 做好代码的优化很重要,特别是面对大量数据的时候,但是我们要想清楚,有时候并不是靠那几行re.compile就能提高多大的性能,精简流程,合理的设计模式才是重点. 工作中还是要做好和同事的沟通,不要和我一样,不然迟早会被别人唾弃.
根据下面评论的提示re.compile()那一行应该放在迭代外面的代码块里,相比图中的时间速度会有所提升.😀😀.但是我们的业务逻辑是和上图一样的,而不是在迭代之外.
来源:https://blog.csdn.net/qq_40244755/article/details/103369421
猜你喜欢
- 本文实例为大家分享了opencv实现图像旋转效果的具体代码,供大家参考,具体内容如下图像旋转:在opencv中首先根据旋转角度和中心获取旋转
- 前言我们在日常文本处理中,经常会将数据结构保存在列表中,如果将列表中的项进行关联,创建我们想要的字典结构,存取就会十分方便!示例详解比如说将
- 在 .NET Framework 2.0中,ConfigurationManager类新增了两个属性AppSe
- 本文实例为大家分享了python实现汉诺塔游戏的具体代码,供大家参考,具体内容如下一.汉诺塔汉诺塔问题是一个经典的递归问题,对于这个问题,我
- 今天在测试以下代码时遇到该错误:session_start();$_SESSION['username']=$usernam
- 网上关于PyQt5的教程很少,特别是界面跳转这一块儿,自己研究了半天,下来和大家分享一下一、首先是主界面# -*- coding: utf-
- 我们平常用 IE 打开一个普通的本地 xml 文件,其形式通常都是如下图: 默认样式看得多了就不觉得有什么特别。但对于少接触 xml 的人来
- js 读取csv内容拼接成jsonformdata对象上传了csv文件,读取文件内容拼接成json对象var form = new Form
- 问:如何给导入文件加上时间戳标记?答:请参考下文中介绍的两种方法:1.在DOS下从系统获得时间戳利用Dos命令取得时间戳:C:\>ec
- 假如不使用INSTEAD OF触发器或可更新分区视图而是通过视图来修改数据,那么再修改之前,请考虑下列准则:◆如果在视图定义中使用了 WIT
- 先看下面例子的效果:<INPUT TYPE="text" NAME=""&
- 与Channel区别Channel能够很好的帮助我们控制并发,但是在开发习惯上与显示的表达不太相同,所以在Go语言中可以利用sync包中的W
- 条件判断计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if
- 在爬虫的获取数据上,一直在讲一些爬取的方法,想必小伙伴们也学习了不少。在学习的过程中遇到了问题,大家也会一起交流解决,找出不懂和出错的地方。
- collections.namedtuple用于构造带字段名的元组。对应类型为typing.NamedTuple(可用作超类)。具名元组na
- 一、软件准备:以下均为截止2005-4-20的最新正式版本PHP(5.1.2):http://www.php.netMySQL(5.0.19
- replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(st
- 使用本文提供的JavaScript脚本,配合Dreamweaver的层和行为的运用,可以在页面中显示可拖动的精美月历。具体制作步骤如下:1、
- 1、生成数据集(双月数据集)class moon_data_class(object): def __init__
- 本文实例讲述了PHP实现的redis主从数据库状态检测功能。分享给大家供大家参考,具体如下:实例:<?php/** * 检测多个主从r