2012-03-30 13 views
35

Chcę, aby zastąpić ciąg w Pythonie, ale tylko pierwsze wystąpienie będzie od prawej do lewej. W idealnym świecie Musiałbym:Zamienianie tekstu od prawej do lewej w Pythonie?

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

> missXXXippi 

Jaki jest najlepszy sposób to zrobić, biorąc pod uwagę, że rreplace nie istnieje?

+6

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

Odpowiedz

58

rsplit i join można wykorzystać do symulowania efektów w rreplace

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

+1 dla rozwiązania, które jest zrozumiałe dla programistów, którzy śledzą. – strongMA

+0

+1 To jest najlepsza odpowiedź! – uccie

+1

W przeciwieństwie do innych rozwiązań, ten jest również łatwo rozszerzalny, aby wykonać wiele zamienników z prawej strony. – Anaphory

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

, który jest tak * nie * newbie przyjazny ... :) – brice

+0

Zakładam, że robi to, co robi @ sleeplessnerd, ale bez 'reverse '? – fredley

+0

@brice Jeśli to działa, nie obchodzi mnie – fredley

0

To trochę brudnego siekać, ale można odwrócić ciąg i zastąpić również odwróconych strun.

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

Nie ma metody "reverse()" dla łańcuchów. –

6

można odwrócić ciąg tak:

myStr[::-1] 

zastąpić wystarczy dodać .replace:

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

jednak teraz ciąg jest do tyłu, więc ponownie odwrócić go:

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

i gotowe. Jeśli zastępowane ciągi są statyczne, po prostu odwróć je w pliku, aby zmniejszyć narzut. Jeśli nie, ta sama sztuczka zadziała.

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

zapomniałeś odwrócić dopasowany tekst i tekst zastępczy. – sleeplessnerd

+1

Nie, powiedziałem na koniec, co zrobić, jeśli chcesz, żeby były odwrócone. – Serdalis

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

Silnik regex cosumes cały ciąg, a następnie rozpoczyna backtracking bez tytułu iss znaleziono. Następnie zastępuje znaleziony ciąg wymaganym wzorcem.


Niektóre prędkość tests

Rozwiązanie z [::-1] okazuje się szybciej.

Rozwiązanie z re było szybsze tylko w przypadku długich ciągów (dłuższych niż 1 milion symboli).

+0

Czy jest to bardziej wydajne niż metoda odwracania krótkich łańcuchów (<20 znaków)? – fredley

+0

@ TomMedley Nie wiem. Nie zrobiłem żadnych testów prędkości. Jak wiem, cofanie jest dość powolne. A jeśli 'iss' jest gdzieś na początku łańcucha, zajmie trochę czasu bracktrack, aż silnik znajdzie pozycję, w której' iss' pasuje. – ovgolovin

+0

@TomMedley Ale nie sądzę, że te '[:: - 1]' w innych rozwiązaniach są szybsze :) – 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 
Powiązane problemy