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

时间:2012-03-30 13:00:39

标签: python

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

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

> missXXXippi

鉴于rreplace不存在,最好的方法是什么?

8 个答案:

答案 0 :(得分:70)

rsplitjoin可用于模拟rreplace

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

答案 1 :(得分:22)

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

答案 2 :(得分:15)

>>> re.sub(r'(.*)iss',r'\1XXX',myStr)
'missXXXippi'

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


有些速度tests

[::-1]的解决方案变得更快。

对于长字符串(长度超过100万个符号),re的解决方案速度更快。

答案 3 :(得分:8)

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

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]

答案 4 :(得分:3)

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

答案 5 :(得分:1)

您还可以使用str.rpartition(),该字符串按指定的分隔符从右开始分割字符串,并返回一个元组:

myStr = "mississippi"

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

使用包 fishhook(可通过 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'