Comment diviser une chaîne en fonction de plusieurs délimiteurs en Python

  1. Chaîne fendue en Python avec deux délimiteurs
  2. Chaîne fractionnée Python avec plusieurs délimiteurs

La méthode de chaîne Python split() permet de diviser facilement une chaîne en une liste basée sur un délimiteur. Bien que dans certains cas, la séparation puisse se produire en fonction non pas d’une seule, mais de plusieurs valeurs de délimiteur. Cet article rapide 101 présente deux approches pratiques réalisables en Python.

Chaîne fendue en Python avec deux délimiteurs

Supposons la chaîne suivante.

text = "python is, an easy;language; to, learn."

Pour notre exemple, nous devons le séparer soit par un point-virgule suivi d’un espace ;, ou par une virgule suivie d’un espace ,. Dans ce cas, toutes les occurrences de points-virgules ou virgules singuliers, c’est-à-dire , , ; sans espaces de fin ne doivent pas être concernées.

Expressions régulières

Bien que l’utilisation d’expressions régulières soit souvent mal vue en raison de sa nature assez coûteuse lorsqu’il s’agit d’analyser des chaînes, elle peut être garantie en toute sécurité dans une situation comme celle-ci.

Utilisation de l’expression de base

Le module intégré de Python re a une méthode split() que nous pouvons utiliser dans ce cas.

Utilisons une expression régulière de base a ou b (a | b) pour séparer nos multiples délimiteurs.

import re

text = "python is, an easy;language; to, learn."
print(re.split('; |, ', text))

Production

['python is', 'an easy;language', 'to', 'learn.']

Comme mentionné sur la page Wikipedia, les expressions régulières utilisent IEEE POSIX comme standard pour sa syntaxe. En se référant à cette norme, nous pouvons administrer plusieurs façons supplémentaires d’écrire une expression régulière qui correspond à notre cas d’utilisation.

Au lieu d’utiliser des séparateurs de barres (|) pour définir nos délimiteurs, nous pouvons obtenir le même résultat en utilisant la syntaxe Range ([]) fournie dans les expressions régulières. Vous pouvez définir une plage de caractères à laquelle une expression régulière peut correspondre en les fournissant entre crochets.

Par conséquent, lorsque vous spécifiez le modèle de notre expression régulière, nous pouvons simplement fournir un point-virgule et une virgule entre crochets et un espace supplémentaire [;,] qui entraînerait la correspondance de l’expression régulière par des parties d’une chaîne avec exactement [un point-virgule OR virgule] et un espace de fin.

import re

text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))

Faites-en une fonction

L’expression de base mentionnée précédemment était limitée à un ensemble de séparateurs codés en dur. Cela peut plus tard entraîner des tracas lorsque des modifications de délimiteur se produisent et limite également sa réutilisabilité sur d’autres parties du code. Par conséquent, il est préférable, en termes d’utilisation des meilleures pratiques, d’envisager de rendre le code plus générique et réutilisable. Par conséquent, codons cette logique en fonction Python juste pour être de notre côté sûr.

import re
text = "python is, an easy;language; to, learn."
separators = "; ", ", "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = '|'.join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

Utilisation des fonctions de chaîne

Dans le cas où vous souhaitez vous abstenir d’utiliser des expressions régulières ou n’avez pas besoin d’introduire de nouveaux modules dans le projet juste pour le fractionnement d’une chaîne, vous pouvez utiliser replace() et split() présentes dans le module de chaîne lui-même d’une manière hacky pour atteindre le même résultat.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")

print(text_one_delimiter.split(", "))

Ici tout d’abord, nous remplaçons toutes les occurrences d’un point-virgule suivi d’un espace (; ) dans la chaîne par notre autre délimiteur qui est une virgule suivie d’un espace (, ). De cette façon, nous pouvons limiter le fractionnement de chaîne à un seul délimiteur, qui est une virgule suivie d’un espace (, ) dans ce cas.

Maintenant, nous pouvons scinder cette chaîne modifiée en toute sécurité à l’aide de la simple fonction split() fournie par le module de chaîne Python pour obtenir le même résultat.

Notez que nous n’avons pas importé de nouveaux modules dans le code cette fois pour obtenir le résultat.

Chaîne fractionnée Python avec plusieurs délimiteurs

Considérez le texte mentionné ci-dessous.

text = "python is# an% easy;language- to, learn."

Pour cet exemple, nous devons le diviser sur toutes les instances où le texte a l’un des caractères #%; -,suivi d’un espace.

Expressions régulières

Dans ce cas, nous pouvons facilement ajouter des séparateurs supplémentaires lors de la définition de notre expression régulière.

import re

text = "python is# an% easy;language- to, learn."
print(re.split('; |, |# |% |- ', text))

Production

['python is', 'an', 'easy;language', 'to', 'learn.']

En tant que fonction

Dans cette situation également, nous pouvons simplement utiliser le même code que nous avons utilisé précédemment avec deux délimiteurs avec un simple changement d’ajouter tous les séparateurs supplémentaires dans la variable separators.

import re
text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = '|'.join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

Utilisation des fonctions de chaîne

Semblable à la façon dont nous l’avons traité auparavant avec deux délimiteurs, nous pouvons utiliser replace() et split() pour gérer cela également.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")

print(text_one_delimiter.split(", "))

Production:

['python is', 'an easy;language', 'to', 'learn.']

Il convient de noter que cette méthode n’est pas recommandée lorsqu’elle est utilisée pour des nombres de délimiteurs plus élevés, comme dans ce cas. Étant donné que dans ce cas, la méthode replace() de la chaîne devra être utilisée plusieurs fois pour effectuer plusieurs traversées sur la chaîne, elle entraînerait en fin de compte des pics de performances indésirables facilement évitables à l’aide d’expressions régulières.

Article connexe - Python String

  • Comment obtenir une sous-chaîne d'une chaîne en Python
  • Comment supprimer le dernier caractère d'une chaîne de caractères en Python