2013-01-24 17 views

Odpowiedz

117

to powinien to zrobić

old_string = "this is going to have a full stop. some written sstuff!" 
k = old_string.rfind(".") 
new_string = old_string[:k] + ". - " + old_string[k+1:] 
+12

Jedne wkładki są świetne i wszystkie, ale najlepiej byłoby zrobić 'str.rfind()' tylko raz dla zwiększenia wydajności. –

+0

Wielkie dzięki. Będę musiał to przestudiować przez chwilę ... to wykorzystuje plastry, prawda? –

+0

@AdamMagyar yes, container [a: b] plasterki od indeksu kontenera do b-1. Jeśli "a" jest pominięte, wówczas domyślnie przyjmuje wartość 0; jeśli "b" jest pominięte, domyślnie jest to len (kontener). Operator plus po prostu się łączy. Funkcja rfind, jak wskazano, zwraca indeks, wokół którego powinna nastąpić operacja wymiany. –

10

użyłbym regex:

import re 
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list] 
+1

Jest to jedyna odpowiedź, która działa jeśli w ogóle nie ma kropki. Użyłbym jednak strony z wyprzedzeniem: '\. (? = [^.] * $)' – georg

+0

@ thg435: Dobry pomysł, dzięki! –

-1

naiwne podejście:

a = "A long string with a . in the middle ending with ." 
fchar = '.' 
rchar = '. -' 
a[::-1].replace(fchar, rchar[::-1], 1)[::-1] 

Out[2]: 'A long string with a . in the middle ending with . -' 

odpowiedź Aditya Sihag za pomocą pojedynczego rfind:

pos = a.rfind('.') 
a[:pos] + '. -' + a[pos+1:] 
+0

Powoduje to również odwrócenie ciągu zastępczego. Poza tym jest to powtórzenie odpowiedzi root'a i, jak mówię, dość nieefektywna. –

+0

@Lattyware Masz na myśli, że odwraca "a"? –

+0

Mam na myśli, że odwraca ". -'' na wyjściu. –

23

Aby wymienić od prawej:

def replace_right(source, target, replacement, replacements=None): 
    return replacement.join(source.rsplit(target, replacements)) 

w użyciu:

>>> replace_right("asd.asd.asd.", ".", ". -", 1) 
'asd.asd.asd. -' 
+2

+1, podoba mi się ta wersja. Proste i skuteczne, a także nie mające oczywistych nieefektywności. –

+0

Ah Podoba mi się to, bardzo. Dziękuję również! –

+3

Wziąłem trochę swobody w przerobieniu twojego przykładu dla jasności i dopasowania go do przykładu OP. Czuję się źle, zmieniając odpowiedź tak bardzo - ale podstawowa treść jest taka sama i wydaje mi się, że poprawia ją, więc mam nadzieję, że wszystko będzie dobrze. –

7

Jeden liner będzie:

str=str[::-1].replace(".",".-",1)[::-1]

+1

działa dobrze, aby zastąpić ostatnie wystąpienie! – Lydia

Powiązane problemy