在 Python 中从右到左的字符串替换?

我想在 Python 中执行字符串替换,但是只执行从右到左的第一个实例。在一个理想的世界里,我会有:

myStr = "mississippi"
print myStr.rreplace("iss","XXX",1)


> missXXXippi

考虑到 rreplace并不存在,最好的方法是什么?

45012 次浏览
>>> myStr[::-1].replace("iss"[::-1], "XXX"[::-1], 1)[::-1]
'missXXXippi'

这是一种肮脏的黑客行为,但你可以反转字符串,并替换为也反转字符串。

"mississippi".reverse().replace('iss'.reverse(), 'XXX'.reverse(),1).reverse()

你可以像这样反转一个字符串:

myStr[::-1]

替换只需添加 .replace:

print myStr[::-1].replace("iss","XXX",1)

然而现在你的字符串是向后的,所以重新反转它:

myStr[::-1].replace("iss","XXX",1)[::-1]

你就完了。 如果替换字符串是静态的,那么只需在文件中反转它们,以减少开销。 如果不是,同样的把戏也会奏效。

myStr[::-1].replace("iss"[::-1],"XXX"[::-1],1)[::-1]
>>> re.sub(r'(.*)iss',r'\1XXX',myStr)
'missXXXippi'

正则表达式引擎包含所有字符串,然后开始回溯,直到找到 iss。然后用所需的模式替换找到的字符串。


一些速度 测试

使用 [::-1]的解决方案结果是更快的。

使用 re的解决方案只对长字符串(超过100万个符号)更快。

def rreplace(s, old, new):
try:
place = s.rindex(old)
return ''.join((s[:place],new,s[place+len(old):]))
except ValueError:
return s

rsplitjoin可以用来模拟 rreplace的作用

>>> 'XXX'.join('mississippi'.rsplit('iss', 1))
'missXXXippi'

您还可以使用 str.rpartition(),它将字符串从右分隔开,并返回一个元组:

myStr = "mississippi"


first, sep, last = myStr.rpartition('iss')
print(first + 'XXX' + last)
# missXXXippi

使用包 鱼钩(可通过 pip 获得) ,您可以添加此功能。

from fishhook import hook


@hook(str)
def rreplace(self, old, new, count=-1):
return self[::-1].replace(old[::-1], new[::-1], count)[::-1]


print('abxycdxyef'.rreplace('xy', '--', count=1))


# 'abxycd--ef'