OTZ*_*OTZ 10 php python string
除了对字符串进行"替换"链接(即text.replace(a,b).replace(c,d).replace(e,f)...)之外,是否有任何推荐的方法来进行多个字符串替换?例如,您如何实现一个快速的函数,其行为类似于Python中的PHP的htmlspecialchars?
我比较了(1)多个'替换'方法,(2)正则表达方法,和(3)马特安德森的方法.
n = 10次运行,结果如下:
在100个字符上:
TIME: 0 ms [ replace_method(str) ] TIME: 5 ms [ regular_expression_method(str, dict) ] TIME: 1 ms [ matts_multi_replace_method(list, str) ]
在1000个字符上:
TIME: 0 ms [ replace_method(str) ] TIME: 3 ms [ regular_expression_method(str, dict) ] TIME: 2 ms [ matts_multi_replace_method(list, str) ]
在10000个字符上:
TIME: 3 ms [ replace_method(str) ] TIME: 7 ms [ regular_expression_method(str, dict) ] TIME: 5 ms [ matts_multi_replace_method(list, str) ]
在100000个字符上:
TIME: 36 ms [ replace_method(str) ] TIME: 46 ms [ regular_expression_method(str, dict) ] TIME: 39 ms [ matts_multi_replace_method(list, str) ]
在1000000个字符上:
TIME: 318 ms [ replace_method(str) ] TIME: 360 ms [ regular_expression_method(str, dict) ] TIME: 320 ms [ matts_multi_replace_method(list, str) ]
在3687809字符:
TIME: 1.277524 sec [ replace_method(str) ] TIME: 1.290590 sec [ regular_expression_method(str, dict) ] TIME: 1.116601 sec [ matts_multi_replace_method(list, str) ]
所以对Matt在相当大的输入字符串上击败多'替换'方法感到荣幸.
任何人都有想法在较小的字符串上击败它吗?
像下面这样的东西?将文本分成多个部分,第一个“ from”项将被替换,然后将这些部分递归地分为多个子部分,再替换下一个“ from”项,依此类推,直到您访问了所有替换项。然后,随着递归函数的完成,为每个替换项添加“ to”替换项。
也许很难理解下面的代码(这对我来说是我写的),但是它似乎可以正常工作。我没有对其进行基准测试,但是我怀疑它会相当快。
def multi_replace(pairs, text):
stack = list(pairs)
stack.reverse()
def replace(stack, parts):
if not stack:
return parts
# copy the stack so I don't disturb parallel recursions
stack = list(stack)
from_, to = stack.pop()
#print 'split (%r=>%r)' % (from_, to), parts
split_parts = [replace(stack, part.split(from_)) for part in parts]
parts = [to.join(split_subparts) for split_subparts in split_parts]
#print 'join (%r=>%r)' % (from_, to), parts
return parts
return replace(stack, [text])[0]
print multi_replace(
[('foo', 'bar'), ('baaz', 'foo'), ('quux', 'moop')],
'foobarbaazfooquuxquux')
Run Code Online (Sandbox Code Playgroud)
对于:
barbarfoobarmoopmoop
Run Code Online (Sandbox Code Playgroud)