rreplace – ¿Cómo reemplazar la última aparición de una expresión en una cadena?

¿Existe una forma rápida en Python para reemplazar cadenas pero, en lugar de comenzar desde el principio como lo hace la replace , comenzar desde el final? Por ejemplo:

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

 >>> 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' 

No voy a pretender que esta es la forma más eficiente de hacerlo, pero es una forma simple. Invierte todas las cadenas en cuestión, realiza un reemplazo ordinario usando str.replace en las cadenas invertidas, luego revierte el resultado de la manera correcta:

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

Si sabe que la cadena ‘antigua’ no contiene ningún carácter especial, puede hacerlo con una expresión regular:

 In [44]: s = '
Hello
' In [45]: import re In [46]: re.sub(r'(.*)', r'\1', s) Out[46]: '
Hello
'

Aquí hay una solución recursiva al problema:

 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 

Simplemente invierta la cadena, reemplace la primera aparición y vuelva a revertirla:

 mystr = "Remove last occurrence of a BAD word. This is a last BAD word." removal = "BAD" reverse_removal = removal[::-1] replacement = "GOOD" reverse_replacement = replacement[::-1] newstr = mystr[::-1].replace(reverse_removal, reverse_replacement, 1)[::-1] print ("mystr:", mystr) print ("newstr:", newstr) 

Salida:

 mystr: Remove last occurence of a BAD word. This is a last BAD word. newstr: Remove last occurence of a BAD word. This is a last GOOD word.