gpt4 book ai didi

python - php 的 strtr for python

转载 作者:太空狗 更新时间:2023-10-29 21:21:16 28 4
gpt4 key购买 nike

php 有 strtr功能:

strtr('aa-bb-cc', array('aa' => 'bbz', 'bb' => 'x', 'cc' => 'y'));
# bbz-x-y

它用相应的值替换字符串中的字典键,并且(重要的)不替换已经替换的字符串。在 python 中编写相同的天真尝试:

def strtr(strng, replace):
for s, r in replace.items():
strng = strng.replace(s, r)
return strng

strtr('aa-bb-cc', {'aa': 'bbz', 'bb': 'x', 'cc': 'y'})

返回 xz-x-y 这不是我们想要的(bb 再次被替换)。如何更改上述函数,使其表现得像对应的 php 函数?

(如果可能的话,我更喜欢没有正则表达式的答案)。

更新:这里有一些很好的答案。我对它们进行了计时,发现对于短字符串,Gumbo 的版本似乎是最快的,对于较长的字符串,获胜者是 re 解决方案:

# 'aa-bb-cc'
0.0258 strtr_thg
0.0274 strtr_gumbo
0.0447 strtr_kojiro
0.0701 strtr_aix

# 'aa-bb-cc'*10
0.1474 strtr_aix
0.2261 strtr_thg
0.2366 strtr_gumbo
0.3226 strtr_kojiro

我自己的版本(略微优化了 Gumbo 的版本):

def strtr(strng, replace):
buf, i = [], 0
while i < len(strng):
for s, r in replace.items():
if strng[i:len(s)+i] == s:
buf.append(r)
i += len(s)
break
else:
buf.append(strng[i])
i += 1
return ''.join(buf)

完整的代码和时间:https://gist.github.com/2889181

最佳答案

下面使用正则表达式来做:

import re

def strtr(s, repl):
pattern = '|'.join(map(re.escape, sorted(repl, key=len, reverse=True)))
return re.sub(pattern, lambda m: repl[m.group()], s)

print(strtr('aa-bb-cc', {'aa': 'bbz', 'bb': 'x', 'cc': 'y'}))

与 PHP 版本一样,这会优先考虑较长的匹配项。

关于python - php 的 strtr for python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com