2012-03-30 11 views
35

Quiero reemplazar cadenas en Python, pero solo hago la primera instancia yendo de derecha a izquierda. En un mundo ideal tendría:Reemplazar cadena de derecha a izquierda en Python?

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

> missXXXippi 

Cuál es la mejor forma de hacerlo, dado que rreplace no existe?

+6

rel: http://stackoverflow.com/q/2556108/989121 – georg

Respuesta

58

rsplit y join podrían utilizarse para simular los efectos de un rreplace

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

+1 para obtener una solución que sea fácilmente comprensible para los programadores que siguen. – strongMA

+0

+1 ¡Esta es la mejor respuesta! – uccie

+1

A diferencia de otras soluciones, esta también es fácilmente extensible para ejecutar reemplazos múltiples desde la derecha. – Anaphory

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

que es tan * no * es amigable para novatos ... :) – brice

+0

Supongo que esto hace lo que hace @ sleeplessnerd pero sin 'reverse'? – fredley

+0

@brice Si funciona no me importa – fredley

0

Es una especie de hack sucio, pero puede invertir el hilo y reemplazarlo con cuerdas también invertidas.

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

No hay método 'reverse()' para cadenas. –

6

puede revertir una cadena de este modo:

myStr[::-1] 

para reemplazar sólo tiene que añadir el .replace:

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

sin embargo, ahora la cadena está al revés, por lo que volver a invertirlo:

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

y listo. Si sus cadenas de reemplazo son estáticas, simplemente inviértalas en el archivo para reducir la sobrecarga. Si no, el mismo truco funcionará.

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

olvidó revertir el texto coincidente y el texto de reemplazo – sleeplessnerd

+1

No, dije al final qué hacer si quería invertirlos. – Serdalis

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

El motor de expresiones regulares cosumes toda la cadena y luego comienza el retroceso hasta el iss se encuentra. Luego reemplaza la cadena encontrada con el patrón necesario.


algo de velocidad tests

La solución con [::-1] resulta ser más rápido.

La solución con re fue solo más rápida para cadenas largas (más de 1 millón de símbolos).

+0

¿Es esto más eficiente que el método de inversión para cadenas cortas (<20 caracteres)? – fredley

+0

@TomMedley No lo sé. No hice ninguna prueba de velocidad. Como sé, retroceder es bastante lento. Y si 'iss' está en algún lugar al principio de la cadena, tardará un buen tiempo en avanzar hasta que el motor encuentre una posición donde' iss' coincida. – ovgolovin

+0

@TomMedley Pero no creo que esos '[:: - 1]' en las otras soluciones sean más rápidos :) – ovgolovin

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