【问题标题】:Use Python's string.replace vs re.sub使用 Python 的 string.replace 与 re.sub
【发布时间】:2011-08-05 20:27:18
【问题描述】:

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

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

【问题讨论】:

  • 不惜一切代价避免正则表达式! ...直到绝对必要...
  • @jathanism:我不同意。几十年来我一直避免使用正则表达式,直到我终于花时间坐下来真正学习它们。现在我不能没有他们。正则表达式对于许多日常任务非常有用,应该是每个程序员工具箱中熟悉的工具。
  • @ridgerunner:同意,但知道何时使用它们也很重要。对于像这样的简单字符串操作,正则表达式是最重要的。我的经验法则是,如果您可以使用内置字符串函数(split()replace()find() 等)而不需要多个状态变量、复杂的切片等,那么您应该这样做。如果它开始变得复杂,那么您需要使用其他工具,例如正则表达式。
  • 哦,还有关于正则表达式速度的一般性评论:它取决于上下文。在偶尔使用一些正则表达式运行的脚本中,您不会注意到开销。另一方面,在执行一些密集/大量处理的脚本中,当您大量使用正则表达式时,您可能会发现开销不可接受。这就是分析对于确定瓶颈在哪里很重要的地方(我想我也应该在这一点上提出过早的优化是万恶之源这一行)。
  • @Blair:我完全同意。但许多人似乎不喜欢正则表达式,因为他们发现它们“很难”,这仅仅是因为他们没有花时间学习超出表面水平的术语。是的,如果一个简单的字符串替换解决了问题,那么一定要使用它,(这也很可能是最快的解决方案)。但我看到太多复杂的字符串操作解决方案可以用一个精心设计的正则表达式轻松解决。

标签: python regex


【解决方案1】:

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

【讨论】:

  • 如果要多次替换,替换比sub快
  • @SvenMarnach 这仍然适用于 Python 2.7 吗?
  • @jsc123:这个建议是关于避免陷阱和不必要的复杂性;所以是的,它适用于任何 Python 版本。 :)
【解决方案2】:

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

【讨论】:

  • 出于好奇,您是如何在示例输出中执行timeit 的?这对 iPython 来说有什么特别的,允许您使用该语法吗? (哦,还有 +1!)
  • 是的,ipython 神奇地包含了它。 scienceoss.com/…
  • 不确定这是错字还是我遗漏了什么,但你的 str.replace() 运行的循环数是正则表达式运行的 10 倍。
  • @alavin89 如果未指定迭代次数,IPython 会选择一个“拟合值”(ipython.org/ipython-doc/3/interactive/magics.html#magic-timeit)。它选择的值可能会根据执行 sn-p 几次所需的时间进行缩放。由于它报告的时间数是每个循环的,因此循环计数的差异并不重要。
  • 如果您将多个 replace 与单个正则表达式链接起来会怎样。在某些时候,单个正则表达式替换应该比在字符串上链接 N 个 replace 更快,不是吗?
【解决方案3】:

字符串操作通常比正则表达式更可取,因为您可以弄清楚如何调整它。正则表达式非常强大,但它通常速度较慢,并且通常更难编写、调试和维护。

话虽如此,请注意上一段中“通常”的数量!有可能(并且我已经看到它完成了)为您可以使用 20 个字符的正则表达式完成的操作编写无数行字符串操作。在一个好的正则表达式引擎几乎可以完成的任务上使用“高效”的字符串函数也可能浪费宝贵的时间。然后是可维护性:正则表达式可能非常复杂,但有时正则表达式比一大块程序代码更简单、更容易阅读。

正则表达式的预期用途非常棒:在高度可变的大海捞针中寻找高度可变的针。把它想象成一个精密扭矩扳手:它是完成特定工作的完美工具,但它是一把糟糕的锤子。

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

如果其中任何一个问题的答案是“是”,那么您可能需要进行字符串操作。否则,请考虑正则表达式。

【讨论】:

    【解决方案4】:

    要考虑的另一件事是,如果您要进行相当复杂的替换,str.translate() 可能就是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多