Así que tengo una lista larga de cadenas en el mismo formato y quiero encontrar el último "." carácter en cada uno y reemplazarlo con ". -". Intenté usar rfind, pero parece que no puedo utilizarlo correctamente para hacer esto.
Así que tengo una lista larga de cadenas en el mismo formato y quiero encontrar el último "." carácter en cada uno y reemplazarlo con ". -". Intenté usar rfind, pero parece que no puedo utilizarlo correctamente para hacer esto.
Respuestas:
Esto debería hacerlo
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:]
Para reemplazar desde la derecha:
def replace_right(source, target, replacement, replacements=None):
return replacement.join(source.rsplit(target, replacements))
En uso:
>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'
replacements=None
parámetro me parece un error porque si se omite el parámetro, la función dará un error (probado en Python 2.7). Sugeriría eliminar el valor predeterminado, establecerlo en -1 (para reemplazos ilimitados) o mejor hacerlo replacements=1
(que creo que debería ser el comportamiento predeterminado para esta función en particular de acuerdo con lo que quiere el OP). De acuerdo con la documentación, este parámetro es opcional, pero debe ser un int si se proporciona.
". -".join("asd.asd.asd.".rsplit(".", 1))
. Todo lo que está haciendo es realizar una división de cadena desde el lado derecho para una aparición y volver a unir la cadena utilizando el reemplazo.
Usaría una expresión regular:
import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
\.(?=[^.]*$)
Un trazador de líneas sería:
str=str[::-1].replace(".",".-",1)[::-1]
.replace
con una cuerda invertida. Ambas cuerdas pasaron para replace
tener que invertirse también. De lo contrario, cuando invierta la cadena por segunda vez, las letras que acaba de insertar estarán al revés. Solo puede usar esto si está reemplazando una letra con una letra, e incluso entonces no pondría esto en su código en caso de que alguien tenga que cambiarlo en el futuro y comience a preguntarse por qué se escribe una palabra sdrawkcab.
Puede usar la función a continuación que reemplaza la primera aparición de la palabra de la derecha.
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 ."
# si desea encontrar el índice de la última aparición de cualquier cadena, en nuestro caso # encontraremos el índice de la última aparición de con
index = a.rfind("with")
# el resultado será 44, ya que el índice comienza desde 0.
Enfoque ingenuo:
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 respuesta de Aditya Sihag con un solo rfind
:
pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]
a
?
'. -'
en la salida.
replace_right
es mucho mejor)