使用Python的string.replace vs re.sub

wag*_*639 58 python regex

对于Python 2.5,2.6,我应该使用string.replace还是re.sub基本的文本替换?

在PHP中,这是明确说明的,但我找不到类似的Python注释.

Sve*_*ach 62

只要你可以str.replace()使用它,你应该使用它.它避免了正则表达式的所有陷阱(如转义),并且通常更快.

  • 如果你要多次替换,替换比 sub 更快 (2认同)
  • @ jsc123:这个建议是关于避免陷阱和不必要的复杂性; 是的,它适用于任何Python版本.:) (2认同)

chm*_*lig 45

str.replace()只要有可能就应该使用.它更明确,更简单,更快捷.

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
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,您是如何在示例输出中执行`timeit`的?这对iPython来说是否特别允许您使用该语法?(哦,还有+1!) (2认同)
  • 是的,ipython神奇地包含它.http://scienceoss.com/test-the-speed-of-your-code-interactively-in-ipython/ (2认同)
  • 不确定这是一个错字还是我遗漏了什么,但是您的 str.replace() 运行的循环数是正则表达式运行的 10 倍。 (2认同)
  • @alavin89 如果未指定,IPython 会为迭代计数选择一个“拟合值”(https://ipython.org/ipython-doc/3/interactive/magics.html#magic-timeit)。它选择的值可能会根据执行片段所需的时间进行少量调整。由于它报告的计时数字是每个循环的,因此循环计数的差异并不重要。 (2认同)

Jus*_*gan 31

当你可以弄清楚如何调整它时,字符串操作通常比正则表达式更好.正则表达式非常强大,但它通常较慢,通常更难编写,调试和维护.

话虽如此,请注意上段中"通常"的数量!有可能(而且我已经看到它已经完成)为你可以用20个字符的正则表达式做的事情写出数十亿行字符串操作.使用"高效"字符串函数浪费宝贵的时间就可以完成一个好的正则表达式引擎几乎同样快的任务.再就是可维护性:正则表达式可以是可怕的复杂,但有时一个正则表达式将会更简单,更容易比对程序代码的巨型块读取.

正则表达式的目的非常出色:在高度变化的草垛中寻找高度可变的针头.可以把它想象成一个精确的扭矩扳手:它是完成一系列特定作业的完美工具,但它却是一个糟糕的锤子.

当您不确定要使用什么时,您应该遵循一些准则:

如果任何这些问题的答案都是"是",那么您可能需要字符串操作.否则,请考虑正则表达式.


jat*_*ism 9

另一件需要考虑的事情是,如果您正在进行相当复杂的替换,str.translate()可能就是您正在寻找的东西.