Mam więc długą listę ciągów w tym samym formacie i chcę znaleźć ostatni „”. znak w każdym z nich i zamień go na „. -”. Próbowałem użyć rfind, ale nie mogę go właściwie wykorzystać, aby to zrobić.
Mam więc długą listę ciągów w tym samym formacie i chcę znaleźć ostatni „”. znak w każdym z nich i zamień go na „. -”. Próbowałem użyć rfind, ale nie mogę go właściwie wykorzystać, aby to zrobić.
Odpowiedzi:
To powinno wystarczyć
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:]
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. -'
replacements=None
parametru wydaje mi się błędem, ponieważ jeśli parametr zostanie pominięty, funkcja spowoduje błąd (próbowano w Pythonie 2.7). Sugerowałbym albo usunięcie wartości domyślnej, ustawienie jej na -1 (dla nieograniczonej liczby wymian) lub lepsze jej wykonanie replacements=1
(co moim zdaniem powinno być domyślnym zachowaniem dla tej konkretnej funkcji zgodnie z tym, czego chce PO). Zgodnie z dokumentacją ten parametr jest opcjonalny, ale jeśli został podany, musi to być wartość int.
". -".join("asd.asd.asd.".rsplit(".", 1))
. Wszystko, co robisz, to rozdzielenie ciągu z prawej strony na jedno wystąpienie i ponowne połączenie łańcucha za pomocą zamiany.
Użyłbym wyrażenia regularnego:
import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
\.(?=[^.]*$)
Jedna linijka to:
str=str[::-1].replace(".",".-",1)[::-1]
.replace
na odwróconej strunie. Oba przekazane ciągi również replace
muszą zostać odwrócone. W przeciwnym razie, gdy odwrócisz ciąg po raz drugi, wstawione litery będą odwrócone. Możesz tego użyć tylko wtedy, gdy zastępujesz jedną literę jedną literą, a nawet wtedy nie umieściłbym tego w twoim kodzie, gdyby ktoś musiał to zmienić w przyszłości i zaczął się zastanawiać, dlaczego słowo jest napisane sdrawkcab.
Możesz użyć poniższej funkcji, która zastępuje pierwsze wystąpienie słowa od prawej.
def replace_from_right(text: str, original_text: str, new_text: str) -> str:
""" Replace first occurrence of original_text by new_text. """
return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]
a = "A long string with a . in the middle ending with ."
# jeśli chcesz znaleźć indeks ostatniego wystąpienia dowolnego ciągu, w naszym przypadku # znajdziemy indeks ostatniego wystąpienia z
index = a.rfind("with")
# wynikiem będzie 44, ponieważ indeks zaczyna się od 0.
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ź Adityi Sihag z jednym rfind
:
pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]
a
?
'. -'
na wyjściu.
replace_right
jest o wiele przyjemniejsza)