¿Dividir por el último delimitador en una cadena de Python?
¿Cuál es el modismo de Python recomendado para dividir una cadena en la última aparición del delimitador en la cadena? ejemplo:
# instead of regular split
>> s = "a,b,c,d"
>> s.split(",")
>> ['a', 'b', 'c', 'd']
# ..split only on last occurrence of ',' in string:
>>> s.mysplit(s, -1)
>>> ['a,b,c', 'd']
mysplit
toma un segundo argumento que es la aparición del delimitador que se va a dividir. Como en la indexación de listas normal, -1
significa el último desde el final. ¿Cómo se puede hacer esto?
Utilice .rsplit()
o .rpartition()
en su lugar:
s.rsplit(',', 1)
s.rpartition(',')
str.rsplit()
le permite especificar cuántas veces dividir, mientras que str.rpartition()
solo se divide una vez pero siempre devuelve un número fijo de elementos (prefijo, delimitador y sufijo) y es más rápido para el caso de división única.
Manifestación:
>>> s = "a,b,c,d"
>>> s.rsplit(',', 1)
['a,b,c', 'd']
>>> s.rsplit(',', 2)
['a,b', 'c', 'd']
>>> s.rpartition(',')
('a,b,c', ',', 'd')
Ambos métodos comienzan a dividirse desde el lado derecho de la cadena; al dar str.rsplit()
un máximo como segundo argumento, se pueden dividir solo las apariciones situadas más a la derecha.
Si solo necesita el último elemento, pero existe la posibilidad de que el delimitador no esté presente en la cadena de entrada o sea el último carácter de la entrada, utilice las siguientes expresiones:
# last element, or the original if no `,` is present or is the last character
s.rsplit(',', 1)[-1] or s
s.rpartition(',')[-1] or s
Si necesita que desaparezca el delimitador incluso cuando sea el último carácter, usaría:
def last(string, delimiter):
"""Return the last element from string, after the delimiter
If string ends in the delimiter or the delimiter is absent,
returns the original string without the delimiter.
"""
prefix, delim, last = string.rpartition(delimiter)
return last if (delim and last) else prefix
Esto utiliza el hecho de que string.rpartition()
devuelve el delimitador como segundo argumento solo si estaba presente y una cadena vacía en caso contrario.
Puedes usar rsplit
string.rsplit('delimeter',1)[1]
Para obtener la cuerda al revés.