Comment diviser une chaîne en fonction de plusieurs délimiteurs en Python
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
- Supprimer les virgules de la chaîne en Python
- Comment vérifier qu'une chaîne est vide de manière pythonique
- Convertir une chaîne en nom de variable en Python
- Comment supprimer les espaces dans une chaîne de caractères en Python
- Comment extraire des nombres d'une chaîne de caractèresen Python
- Comment convertir une chaîne de caractères en datetime en Python