Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python';s string.replace vs.re.sub_Python_Regex - Fatal编程技术网

使用Python';s string.replace vs.re.sub

使用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

对于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, 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版本。:)