Dividindo no último delimitador na string Python?

205

Qual é o idioma Python recomendado para dividir uma string na última ocorrência do delimitador na string? exemplo:

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

mysplitusa um segundo argumento que é a ocorrência do delimitador a ser dividido. Como na indexação de lista regular, -1significa o último do final. Como isso pode ser feito?

Martijn Pieters
fonte

Respostas:

357

Use .rsplit() ou em .rpartition()vez disso:

s.rsplit(',', 1)
s.rpartition(',')

str.rsplit()permite especificar quantas vezes dividir, enquanto str.rpartition()divide apenas uma vez, mas sempre retorna um número fixo de elementos (prefixo, delimitador e postfix) e é mais rápido para o caso de divisão única.

Demo:

>>> 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 os métodos começam a se dividir do lado direito da string; fornecendo o str.rsplit()máximo como o segundo argumento, você pode dividir apenas as ocorrências mais à direita.

Martijn Pieters
fonte
19

Você pode usar o rsplit

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

Para obter a string ao contrário.

Vivek Ananthan
fonte
5

Eu apenas fiz isso por diversão

    >>> s = 'a,b,c,d'
    >>> [item[::-1] for item in s[::-1].split(',', 1)][::-1]
    ['a,b,c', 'd']

Cuidado : Consulte o primeiro comentário abaixo, onde esta resposta pode dar errado.

ViKiG
fonte
2
'apenas por diversão', mas também muito errado, porque se o delimitador não for apenas um caractere ou um caractere repetido, suas divisões escolherão, na melhor das hipóteses, os pontos errados para dividir.
Martijn Pieters