2010-09-09 19 views
17

Chcę zamienić znaki na końcu ciągu Pythona. Mam ten ciąg:Jak zamienić niektóre znaki na końcu ciągu?

s = "123123" 

chcę zastąpić ostatni 2 z x. Załóżmy, że jest to metoda zwana replace_last:

r = replace_last(s, '2', 'x') 
print r 
1231x3 

Czy istnieje wbudowane lub łatwy sposób to zrobić?

Odpowiedz

26

To jest dokładnie to, co funkcja rpartition służy do:

rpartition (...) S.rpartition (SEP) -> (głowa, wrzesień, ogon)

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. 

Napisałem tę funkcję, pokazujący jak używać rpartition w przypadku użycia:

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 

wyjściowe:

1231x3 
1

Oto rozwiązanie oparte na uproszczonej interpretacji pytania. Lepsza odpowiedź będzie wymagać więcej informacji.

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

Aktualizacja

(Po obejrzeniu edytowane pytanie) kolejny bardzo konkretnej odpowiedzi.

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

Aktualizacja 2

Jest znacznie lepiej way to do this. Dzięki uprzejmości @mizipzor.

+0

Bardzo przepraszam, ja tylko edytowany moje pytanie, uczynienia go bardziej zrozumiałym. – Freewind

+0

dziękuję ci wszystkim :) – Freewind

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

Na swoim drugim przykładzie

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

Kiedy jest poszukiwany mecz na końcu łańcucha, re.sub przychodzi na ratunek.

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

Korzystanie z wyrażeń regularnych w celu zastąpienia słowa na koniec napisu:

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

Prints:

1231penguins 

lub

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

reprodukcje:

penguins3123 
+0

Dla przykładu podanego w pytaniu: 'r = re.sub (r" 2 [^ 2] $ "," x ", s)' – Eric

5

Jest to jedna z niewielu funkcji ciągów, która nie ma wersji lewej i prawej, ale możemy naśladować zachowanie za pomocą niektórych funkcji łańcuchowych.

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

lub

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

+1: A także będąc krótszym niż przyjęte rozwiązanie, to rozwiązanie ma tę zaletę, że można wykonać tyle zamienników z prawej, ile się chce, po prostu zmieniając wartość drugiego parametru w 'rsplit()'. Była to dla mnie korzyść, gdy szukałem rozwiązania tego problemu, ponieważ w przeciwnym razie musiałbym użyć pętli do wielokrotnego zastępowania. – Simon

Powiązane problemy