Fractionner des chaînes de caractères selon des délimiteurs multiples

Python offre de nombreux outils pour fractionner les chaînes de caractères, comme la méthode split() de la classe str. Cette méthode prend un délimiteur comme paramètre principal.

Ensuite, elle découpe la chaîne en fonction du délimiteur choisi – peut être composé d’un ou plusieurs caractères- et stocke les morceaux obtenus dans une liste.

Par exemple, l’instruction “he-ll-o”.split(“-“) retournera la liste [“he”, “ll”, “o”] et l’appel “he-ll-o”.split(“ll”) donne [‘he-‘, ‘-o’], comme indiqué ci-dessus.

>>> "he-ll-o".split("-") 
['he', 'll', 'o']

>>> "he-ll-o".split("ll")
['he-', '-o']
>>>

Vous pouvez déterminer le résultat de la méthode split() en suivant ces étapes :

  1. Remplacez la chaîne de caractères représentant le délimiteur par une virgule dans la chaîne de caractères à fractionner.
  2. Placez la chaîne résultante entre parenthèses.

Bravo, vous avez réussi à le faire.
Maintenant, vous avez construit la valeur de retour de la méthode split() avec succès.

Si vous avez besoin de découper une chaîne de caractères en champs, mais que les délimiteurs (et l’espacement autour d’eux) ne sont pas cohérents dans la chaîne de caractères.

Par exemple, vous voulez extraire les données contenues dans la ligne

"Brian         Mora ; 18, ingénieur,               Paris"

Vous pouvez remarquer facilement qu’elles ne sont pas séparées par le même délimiteur.

Donc, quelle est la solution????

La méthode split() des objets de la classe str est vraiment destinée à des cas très simples et ne permet pas l’utilisation de délimiteurs multiples ou de tenir compte des espaces possibles autour des délimiteurs.

Dans les cas où vous avez besoin d’un peu plus de flexibilité, utilisez la méthode re.split() du module re (regular expression):

>>> ligne = "Brian         Mora; 18, ingénieur,               Paris"

>>> import re

>>> re.split(r'[;,\s]\s*', ligne)
['Brian', 'Mora', '18', 'ingénieur', 'Paris']

>>>

La fonction re.split() est utile parce que vous pouvez spécifier plusieurs motifs (patterns en anglais) pour le séparateur. Par exemple, comme indiqué dans la solution, le séparateur est soit une virgule (,), un point-virgule ( ;), ou un espace suivi de n’importe quelle quantité d’espace supplémentaire.

Chaque fois que ce motif est trouvé, la correspondance entière devient le délimiteur entre les champs situés de chaque côté de la correspondance. Le résultat est une liste de champs, tout comme avec la méthode split() de la classe str.

Lors de l’utilisation de la méthode re.split(), vous devez être un peu prudent si le motif d’expression régulière comporte un groupe de capture inclus entre parenthèses.

Si des groupes de capture sont utilisés, le texte correspondant est également inclus dans le résultat. Par exemple, regardez ce qui se passe dans cet exemple:

>>> ligne = "Brian               Mora; 18, ingénieur,                         Paris"

>>> champs = re.split(r'(;|,|\s)\s*', ligne)

>>> champs
['Brian', ' ', 'Mora', ';', '18', ',', 'ingénieur', ',', 'Paris']

Récupérer les caractères de fractionnement peut être utile dans certains contextes. Par exemple, vous aurez peut-être besoin des caractères séparateurs plus tard pour réformer une chaîne de sortie:

>>> ligne = "Brian               Mora; 18, ingénieur,                         Paris"

>>> champs = re.split(r'(;|,|\s)\s*', ligne)

>>> valeurs = champs[::2]

>>> delimiteurs = champs[1::2] + ['']

>>> valeurs
['Brian', 'Mora', '18', 'ingénieur', 'Paris']

>>> delimiteurs
[' ', ';', ',', ',', '']

>>> ''.join(v+d for v,d in zip(valeurs, delimiteurs))
'Brian Mora;18,ingénieur,Paris'

>>>

Si vous ne voulez pas inclure les caractères de séparation dans le résultat, mais que vous devez quand même utiliser des parenthèses pour grouper des parties du motif de l’expression régulière, utilisez un groupe non capture, spécifié comme (? :…). Par exemple:

>>> re.split(r'(?:,|;|\s)\s*', ligne)
['Brian', 'Mora', '18', 'ingénieur', 'Paris']

>>>

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here