2010-09-09 17 views

Respuesta

26

Esto es exactamente lo que la función rpartition se utiliza para:

rpartition (...) S.rpartition (sep) -> (cabeza, sep, cola)

Search for the separator sep in S, starting at the end of S, and return 
the part before it, the separator itself, and the part after it. If the 
separator is not found, return two empty strings and S. 

escribí esta función que muestra cómo utilizar rpartition en su caso de uso:

def replace_last(source_string, replace_what, replace_with): 
    head, _sep, tail = source_string.rpartition(replace_what) 
    return head + replace_with + tail 

s = "123123" 
r = replace_last(s, '2', 'x') 
print r 

Salida:

1231x3 
1

Aquí hay una solución basada en una interpretación simplista de su pregunta. Una mejor respuesta requerirá más información.

>>> s = "aaa bbb aaa bbb" 
>>> separator = " " 
>>> parts = s.split(separator) 
>>> separator.join(parts[:-1] + ["xxx"]) 
'aaa bbb aaa xxx' 

actualización

(Después de ver editado pregunta) otra respuesta muy específica.

>>> s = "123123" 
>>> separator = "2" 
>>> parts = s.split(separator) 
>>> separator.join(parts[:-1]) + "x" + parts[-1] 
'1231x3' 

Actualización 2

No es mucho mejor way to do this. Cortesía @mizipzor.

+0

Lo siento mucho, me acaba de editar mi pregunta, hacen que sea más clara. – Freewind

+0

gracias de todos modos :) – Freewind

5
>>> s = "aaa bbb aaa bbb" 
>>> s[::-1].replace('bbb','xxx',1)[::-1] 
'aaa bbb aaa xxx' 

Para su segundo ejemplo

>>> s = "123123" 
>>> s[::-1].replace('2','x',1)[::-1] 
'1231x3' 
1

Cuando el partido deseado se encuentra al final de la cadena, re.sub viene al rescate.

>>> import re 
>>> s = "aaa bbb aaa bbb" 
>>> s 
'aaa bbb aaa bbb' 
>>> re.sub('bbb$', 'xxx', s) 
'aaa bbb aaa xxx' 
>>> 
16

Uso de expresiones regulares para reemplazar palabras al final de la cadena:

import re 
s = "123123" 
s = re.sub('23$', 'penguins', s) 
print s 

Lienzo:

1231penguins 

o

import re 
s = "123123" 
s = re.sub('^12', 'penguins', s) 
print s 

Prints:

penguins3123 
+0

Por el ejemplo dado en la pregunta: 'r = re.sub (r" 2 [^ 2] $ "," x ", s)' – Eric

5

Esta es una de las pocas funciones de cadena que no tiene una versión izquierda y derecha, pero podemos imitar el comportamiento utilizando algunas de las funciones de cadena que sí lo hacen.

>>> s = '123123' 
>>> t = s.rsplit('2', 1) 
>>> u = 'x'.join(t) 
>>> u 
'1231x3' 

o

>>> 'x'.join('123123'.rsplit('2', 1)) 
'1231x3' 
+2

+1: Además de ser más corto que la solución aceptada, esta solución tiene la ventaja de que se pueden hacer tantas sustituciones desde la derecha como se desee, simplemente cambiando el valor del segundo parámetro en 'rsplit()'. Esto fue una ventaja para mí cuando busqué una solución a este problema porque de otra manera habría tenido que usar un ciclo para hacer reemplazos múltiples. – Simon

Cuestiones relacionadas