Розщеплення останнього роздільника в рядку Python?


203

Що рекомендується ідіома Python для розбиття рядка на останнє виникнення роздільника в рядку? приклад:

# 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бере другий аргумент, що є поділом роздільника, який потрібно розділити. Як і в звичайній індексації списку, -1означає останню з кінця. Як це можна зробити?

Відповіді:


355

Використовуйте .rsplit() або .rpartition()замість цього:

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

str.rsplit()дозволяє вказати, скільки разів потрібно розділити, при цьому str.rpartition()розбивається лише один раз, але завжди повертає фіксовану кількість елементів (префікс, роздільник та постфікс) і швидше для одиничного випадку розділення.

Демонстрація:

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

Обидва способи починають розщеплення з правого боку рядка; даючи str.rsplit()максимум як другий аргумент, ви можете розділити лише найчастіше правої руки.



5

Я просто це робив для розваги

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

Обережно : зверніться до першого коментаря нижче, де ця відповідь може піти не так.


2
"просто для розваги", але також дуже неправильно, тому що якщо роздільник не є лише одним символом або повторним символом, ваші розбивки виберуть, у кращому випадку, неправильні моменти, на які слід розділити.
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.