¿Dividir por el último delimitador en una cadena de Python?

Resuelto asked hace 11 años • 3 respuestas

¿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']

mysplittoma un segundo argumento que es la aparición del delimitador que se va a dividir. Como en la indexación de listas normal, -1significa el último desde el final. ¿Cómo se puede hacer esto?

 avatar Feb 22 '13 04:02
Aceptado

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.

Martijn Pieters avatar Feb 21 '2013 21:02 Martijn Pieters

Puedes usar rsplit

string.rsplit('delimeter',1)[1]

Para obtener la cuerda al revés.

Wickkiey avatar Mar 15 '2018 16:03 Wickkiey