Dzielenie ostatniego separatora w ciągu Python?

203

Jaki jest zalecany idiom Pythona do dzielenia łańcucha przy ostatnim wystąpieniu ogranicznika w łańcuchu? przykład:

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

mysplitprzyjmuje drugi argument, którym jest występowanie separatora do podzielenia. Podobnie jak w przypadku zwykłego indeksowania list, -1oznacza ostatni od końca. Jak można to zrobić?

Martijn Pieters
źródło

Odpowiedzi:

355

Użyj .rsplit() lub .rpartition()zamiast:

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

str.rsplit()pozwala określić, ile razy podzielić, podczas gdy str.rpartition()dzieli tylko raz, ale zawsze zwraca stałą liczbę elementów (przedrostek, separator i postfiks) i jest szybszy w przypadku pojedynczego podziału.

Próbny:

>>> 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')

Obie metody rozpoczynają dzielenie od prawej strony łańcucha; podając str.rsplit()maksimum jako drugi argument, możesz podzielić tylko te zdarzenia, które najczęściej pojawiają się po prawej stronie.

Martijn Pieters
źródło
19

Możesz użyć rsplit

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

Aby pobrać ciąg z rewersu.

Vivek Ananthan
źródło
5

Zrobiłem to dla zabawy

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

Uwaga : zapoznaj się z pierwszym komentarzem poniżej, w którym odpowiedź może się nie powieść.

ViKiG
źródło
2
„tylko dla zabawy”, ale także bardzo źle, ponieważ jeśli separator nie jest tylko pojedynczym znakiem lub powtarzającą się postacią, twoje podziały wybiorą co najwyżej niewłaściwe punkty do podziału.
Martijn Pieters