Membelah pembatas terakhir dalam string Python?

205

Apa idiom Python yang disarankan untuk memisahkan string pada kejadian terakhir dari pembatas dalam string? contoh:

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

mysplitmengambil argumen kedua yaitu terjadinya pembatas untuk dipecah. Seperti dalam pengindeksan daftar reguler, -1berarti yang terakhir dari akhir. Bagaimana ini bisa dilakukan?

Martijn Pieters
sumber

Jawaban:

357

Gunakan .rsplit() atau .rpartition()sebagai gantinya:

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

str.rsplit()memungkinkan Anda menentukan berapa kali untuk dipecah, sementara str.rpartition()hanya membelah sekali tetapi selalu mengembalikan jumlah elemen yang tetap (prefix, delimiter & postfix) dan lebih cepat untuk case split tunggal.

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

Kedua metode mulai memisahkan dari sisi kanan string; dengan memberikan str.rsplit()maksimal sebagai argumen kedua, Anda bisa membagi hanya kejadian paling kanan.

Martijn Pieters
sumber
19

Anda dapat menggunakan rsplit

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

Untuk mendapatkan string dari terbalik.

Vivek Ananthan
sumber
5

Saya hanya melakukan ini untuk bersenang-senang

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

Perhatian : Lihat komentar pertama di bawah ini di mana jawaban ini bisa salah.

ViKiG
sumber
2
'hanya untuk bersenang-senang' tetapi juga sangat salah, karena jika pembatas bukan hanya satu karakter atau karakter yang diulang, perpecahan Anda akan memilih, paling tidak, poin yang salah untuk dipecah.
Martijn Pieters