2012-03-30 23 views
35

Voglio eseguire una sostituzione di stringa in Python, ma eseguo solo la prima istanza da destra a sinistra. In un mondo ideale che avrei dovuto:Sostituisce la stringa da destra a sinistra in Python?

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

> missXXXippi 

Qual è il modo migliore di farlo, dato che rreplace non esiste?

+6

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

risposta

58

rsplit e join potrebbe essere utilizzato per simulare gli effetti di un rreplace

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

+1 per una soluzione che sia prontamente comprensibile dai programmatori che seguono. – strongMA

+0

+1 Questa è la migliore risposta! – uccie

+1

Al contrario di altre soluzioni, anche questo è facilmente estensibile per eseguire più sostituzioni da destra. – Anaphory

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

che è così * non * newbie amichevole ... :) – brice

+0

Suppongo che questo faccia ciò che fa @ sleeplessnerd senza "reverse"? – fredley

+0

@brice Se funziona non mi interessa – fredley

0

È una specie di trucco sporco, ma è possibile invertire la stringa e sostituire con stringhe anche invertite.

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

Non esiste un metodo 'reverse()' per le stringhe. –

6

si può invertire una stringa in questo modo:

myStr[::-1] 

per sostituire basta aggiungere il .replace:

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

però adesso la tua stringa è all'indietro, in modo da ri-invertirla:

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

e il gioco è fatto. Se le stringhe di sostituzione sono statiche, basta invertirle nel file per ridurre il sovraccarico. In caso contrario, lo stesso trucco funzionerà.

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

ti sei dimenticato di invertire il testo abbinato e il testo sostitutivo – sleeplessnerd

+1

No, ho detto alla fine cosa fare se volessi invertirli. – Serdalis

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

Il motore regex cosumes tutta la corda e poi inizia backtracking fino iss viene trovato. Quindi sostituisce la stringa trovata con il modello necessario.


po 'di velocità tests

La soluzione con [::-1] risulta essere più veloce.

La soluzione con re era solo più veloce per stringhe lunghe (oltre 1 milione di simboli).

+0

È più efficiente del metodo di inversione per le stringhe brevi (<20 caratteri)? – fredley

+0

@ TomMedley Non lo so. Non ho fatto alcun test di velocità. Come so, il backtracking è piuttosto lento. E se 'iss' è da qualche parte all'inizio della stringa, ci vorrà un po 'di tempo prima di bracktrack finché il motore non troverà una posizione in cui' iss' corrisponde. – ovgolovin

+0

@TomMedley Ma non penso che quelli '[:: - 1]' nelle altre soluzioni siano più veloci :) – 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 
Problemi correlati