Fractionnement sur le dernier délimiteur dans la chaîne Python?

205

Quel est l'idiome Python recommandé pour fractionner une chaîne sur la dernière occurrence du délimiteur dans la chaîne? exemple:

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

mysplitprend un deuxième argument qui est l'occurrence du délimiteur à diviser. Comme dans l'indexation de liste régulière, -1signifie le dernier depuis la fin. Comment cela peut-il être fait?

Martijn Pieters
la source

Réponses:

358

Utilisez .rsplit() ou à la .rpartition()place:

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

str.rsplit()vous permet de spécifier le nombre de fois à diviser, tandis que str.rpartition()ne se divise qu'une seule fois mais renvoie toujours un nombre fixe d'éléments (préfixe, délimiteur et postfix) et est plus rapide pour le cas de fractionnement unique.

Démo:

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

Les deux méthodes commencent à se séparer du côté droit de la chaîne; en donnant str.rsplit()un maximum comme deuxième argument, vous pouvez diviser uniquement les occurrences les plus à droite.

Martijn Pieters
la source
19

Vous pouvez utiliser rsplit

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

Pour obtenir la chaîne de l'inverse.

Vivek Ananthan
la source
5

Je l'ai juste fait pour le plaisir

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

Attention : Référez-vous au premier commentaire ci-dessous où cette réponse peut mal tourner.

ViKiG
la source
2
'juste pour le plaisir' mais aussi très faux, car si le délimiteur n'est pas seulement un caractère unique ou un caractère répété, vos divisions choisiront, au mieux, les mauvais points sur lesquels se diviser.
Martijn Pieters