2010-03-31 80 views
72

在Python中是否有一種快速的方法來取代字符串,但是從頭開始,而不是從replace開始,從結尾開始?例如:rreplace - 如何替換字符串中最後一次出現的表達式?

>>> def rreplace(old, new, occurrence) 
>>>  ... # Code to replace the last occurrences of old by new 

>>> '<div><div>Hello</div></div>'.rreplace('</div>','</bad>',1) 
>>> '<div><div>Hello</div></bad>' 
+3

好問題,以複雜的解決方案來判斷這樣一個簡單的問題。 – 2010-03-31 20:22:27

回答

112
>>> def rreplace(s, old, new, occurrence): 
... li = s.rsplit(old, occurrence) 
... return new.join(li) 
... 
>>> s 
'1232425' 
>>> rreplace(s, '2', ' ', 2) 
'123 4 5' 
>>> rreplace(s, '2', ' ', 3) 
'1 3 4 5' 
>>> rreplace(s, '2', ' ', 4) 
'1 3 4 5' 
>>> rreplace(s, '2', ' ', 0) 
'1232425' 
+0

+1我認爲這將會非常快。 – 2010-03-31 20:38:50

+6

非常好!在我的程序中取代典型字符串中最後一次出現的表達的不科學基準(> 500個字符)中,您的解決方案比Alex的解決方案快三倍,比Mark的解決方案快四倍。感謝所有您的答案! – Barthelemy 2010-03-31 20:44:39

+0

感謝您的基準測試結果 – 2012-09-06 20:52:41

7

我不會假裝這是最有效的方法,但它是一種簡單的方法。它顛倒所有字符串有問題,執行使用在反向串str.replace一個普通的更換,然後反轉結果回輪的正確方法:

>>> def rreplace(s, old, new, count): 
...  return (s[::-1].replace(old[::-1], new[::-1], count))[::-1] 
... 
>>> rreplace('<div><div>Hello</div></div>', '</div>', '</bad>', 1) 
'<div><div>Hello</div></bad>' 
1

這裏是一個遞歸方法解決問題:

def rreplace(s, old, new, occurence = 1): 

    if occurence == 0: 
     return s 

    left, found, right = s.rpartition(old) 

    if found == "": 
     return right 
    else: 
     return rreplace(left, old, new, occurence - 1) + new + right 
3

如果您知道「老」字符串中不包含任何特殊字符,你可以做一個正則表達式:

In [44]: s = '<div><div>Hello</div></div>' 

In [45]: import re 

In [46]: re.sub(r'(.*)</div>', r'\1</bad>', s) 
Out[46]: '<div><div>Hello</div></bad>' 
相關問題