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

Resuelto Barthelemy asked hace 14 años • 8 respuestas

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

>>> 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>'
Barthelemy avatar Apr 01 '10 03:04 Barthelemy
Aceptado
>>> 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'
mg. avatar Mar 31 '2010 20:03 mg.

Aquí hay una sola línea :

result = new.join(s.rsplit(old, maxreplace))

Devuelve una copia de la cadena s con todas las apariciones de la subcadena antigua reemplazadas por nueva . Se reemplazan las primeras apariciones de maxreplace .

y un ejemplo completo de esto en uso:

s = 'mississipi'
old = 'iss'
new = 'XXX'
maxreplace = 1

result = new.join(s.rsplit(old, maxreplace))
>>> result
'missXXXipi'
Phil B avatar Nov 28 '2019 05:11 Phil B

No voy a pretender que esta sea la forma más eficaz de hacerlo, pero es una forma sencilla. Invierte todas las cadenas en cuestión, realiza un reemplazo normal usando str.replacelas cadenas invertidas y luego invierte el resultado al revés:

>>> 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>'
Mark Byers avatar Mar 31 '2010 20:03 Mark Byers