使用Python';s string.replace vs.re.sub
对于Python2.5和2.6,我应该使用使用Python';s string.replace vs.re.sub,python,regex,Python,Regex,对于Python2.5和2.6,我应该使用string.replace还是re.sub进行基本文本替换 在PHP中,这是明确说明的,但我找不到类似的Python注释。只要您可以使用str.replace(),就应该使用它。它避免了正则表达式(如逃逸)的所有陷阱,而且一般更快。 < P>另一个要考虑的是,如果您正在做相当复杂的替换,可能是您正在寻找的。它更明确、更简单、更快 In [1]: import re In [2]: text = """For python 2.5, 2.6, shou
string.replace
还是re.sub
进行基本文本替换
在PHP中,这是明确说明的,但我找不到类似的Python注释。只要您可以使用
str.replace()
,就应该使用它。它避免了正则表达式(如逃逸)的所有陷阱,而且一般更快。 < P>另一个要考虑的是,如果您正在做相当复杂的替换,可能是您正在寻找的。它更明确、更简单、更快
In [1]: import re
In [2]: text = """For python 2.5, 2.6, should I be using string.replace or re.sub for basic text replacements.
In PHP, this was explicitly stated but I can't find a similar note for python.
"""
In [3]: timeit text.replace('e', 'X')
1000000 loops, best of 3: 735 ns per loop
In [4]: timeit re.sub('e', 'X', text)
100000 loops, best of 3: 5.52 us per loop
字符串操作通常比正则表达式更可取,因为您可以知道如何调整它。Regex功能强大得令人难以置信,但它通常速度较慢,编写、调试和维护起来也比较困难 也就是说,注意上面段落中“通常”的数量!对于20个字符的正则表达式,可以编写无数行的字符串操作,这是可能的(我也看到过)。在一个好的正则表达式引擎可以完成的任务上使用“高效”字符串函数也可能浪费宝贵的时间。还有可维护性:正则表达式可能非常复杂,但有时正则表达式比一大块过程代码更简单、更易于阅读 正则表达式对于它的预期目的来说是非常棒的:在高度可变的干草堆中搜索高度可变的针。可以把它想象成一个精密的扭矩扳手:它是完成特定工作的完美工具,但它制造的锤子很糟糕 当您不确定使用什么时,应遵循以下准则:
- 您要查找的模式是高度静态的吗?例如,是否要在每个逗号、管道或制表符上拆分字符串
- 资源效率比开发人员时间更重要吗?您的优先事项是什么?记住:
- 你在和谁一起工作呢别忘了
- 我的经验法则是:如果你花5分钟解决这个问题,你能想出一个非正则表达式方法吗?
如果这些问题的答案是“是”,那么您可能需要字符串操作。否则,考虑ReGEX。< /P>不惜一切代价避免正则表达式!除非绝对必要……@jathanism:我不同意。几十年来,我一直避免使用正则表达式,直到我最终花时间坐下来真正学习它们。现在我不能没有他们。正则表达式对于许多日常任务非常有用,应该是每个程序员工具箱中熟悉的工具。@ridgerunner:同意,但知道何时使用它们也很重要。对于像这样的简单字符串操作,正则表达式是非常重要的。我的经验法则是,如果您可以使用内置的字符串函数(
split()
,replace()
,find()
等)而不需要多个状态变量和复杂的切片等,那么您应该这样做。如果它开始变得复杂,那么你可以移动其他工具,比如正则表达式。哦,还有一个关于正则表达式速度的一般评论:它取决于上下文。在偶尔使用几个正则表达式运行的脚本中,您不会注意到开销。另一方面,在执行一些密集/高容量处理的脚本中,当您大量使用正则表达式时,您可能会发现开销是不可接受的。这就是分析对于确定瓶颈在哪里很重要的地方(我想我应该指出,过早的优化也是这一点上所有邪恶路线的根源)。@Blair:我完全同意。但许多人似乎不喜欢正则表达式,因为他们发现正则表达式“很难”,这仅仅是因为他们没有花时间学习超越表面层次的正则表达式。是的,如果一个简单的字符串替换解决了这个问题,那么一定要使用它(这也很可能是最快的解决方案)。但我看到了太多复杂的字符串操作解决方案,这些解决方案很容易用一个精心编制的正则表达式解决。出于好奇,您是如何在示例输出中执行timeit
?iPython允许您使用这种语法是不是有什么特别之处?(哦,还有+1!)是的,ipython神奇地包含了它。不确定这是输入错误还是我遗漏了什么,但str.replace()运行的循环数是正则表达式运行的10倍。@alavin89 IPython为迭代计数选择一个“拟合值”(如果未指定)()。它选择的值可能会根据执行代码段所需的时间进行少量缩放。由于它报告的计时数是每个循环的,因此循环计数的差异并不重要。如果您链接了多个replace
vs单个正则表达式,会怎么样。在某些情况下,单个正则表达式替换应该比在字符串上使用N个链式的replace
快,不是吗?如果要多次替换,则替换比sub@SvenMarnach这是否仍然适用于Python2.7?@jsc123:这个建议是关于避免陷阱和不必要的复杂性;因此,是的,它适用于任何Python版本。:)