Quindi ho un lungo elenco di stringhe nello stesso formato e voglio trovare l'ultimo "." carattere in ciascuno e sostituirlo con ". -". Ho provato a usare rfind, ma non riesco a utilizzarlo correttamente per farlo.
Quindi ho un lungo elenco di stringhe nello stesso formato e voglio trovare l'ultimo "." carattere in ciascuno e sostituirlo con ". -". Ho provato a usare rfind, ma non riesco a utilizzarlo correttamente per farlo.
Risposte:
Questo dovrebbe bastare
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:]
Per sostituire da destra:
def replace_right(source, target, replacement, replacements=None):
return replacement.join(source.rsplit(target, replacements))
In uso:
>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'
replacements=None
parametro mi sembra un errore perché se il parametro viene omesso la funzione darà un errore (provato in Python 2.7). Suggerirei di rimuovere il valore predefinito, impostarlo su -1 (per sostituzioni illimitate) o meglio farlo replacements=1
(che penso dovrebbe essere il comportamento predefinito per questa particolare funzione in base a ciò che vuole l'OP). Secondo i documenti questo parametro è opzionale, ma deve essere un int se fornito.
". -".join("asd.asd.asd.".rsplit(".", 1))
. Tutto quello che stai facendo è eseguire una divisione della stringa dal lato destro per 1 occorrenza e unire di nuovo la stringa usando la sostituzione.
Userei una regex:
import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
\.(?=[^.]*$)
Una linea sarebbe:
str=str[::-1].replace(".",".-",1)[::-1]
.replace
su una stringa invertita. Entrambe le stringhe passate replace
devono essere anch'esse invertite. Altrimenti, quando inverti la stringa una seconda volta, le lettere che hai appena inserito saranno al contrario. Puoi usarlo solo se stai sostituendo una lettera con una lettera, e anche in questo caso non lo inserirò nel tuo codice nel caso in cui qualcuno dovesse cambiarlo in futuro e inizi a chiedersi perché una parola è scritta sdrawkcab.
È possibile utilizzare la funzione sottostante che sostituisce la prima occorrenza della parola da destra.
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 ."
# se vuoi trovare l'indice dell'ultima occorrenza di qualsiasi stringa, nel nostro caso # troveremo l'indice dell'ultima occorrenza di con
index = a.rfind("with")
# il risultato sarà 44, poiché l'indice inizia da 0.
Approccio naïve:
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 . -'
La risposta di Aditya Sihag con un singolo rfind
:
pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]
a
?
'. -'
nell'output.
replace_right
è molto più carino)