Python >> Tutoriel Python >  >> Python Tag >> RegEx

Python Regex Split sans chaîne vide

Formulation du problème

Dites, vous utilisez le re.split(pattern, string) fonction pour diviser une chaîne sur toutes les occurrences d'un modèle donné. Si le modèle apparaît au début ou à la fin de la chaîne, la liste fractionnée résultante contiendra des chaînes vides. Comment se débarrasser automatiquement des chaînes vides ?

Voici un exemple :

import re

s = '--hello-world_how    are\tyou-----------today\t'

words = re.split('[-_\s]+', s)
print(words)
# ['', 'hello', 'world', 'how', 'are', 'you', 'today', '']

Notez les chaînes vides dans la liste résultante.

Contexte

Le re.split(pattern, string) la méthode correspond à toutes les occurrences du pattern dans le string et divise la chaîne le long des correspondances résultant en une liste de chaînes entre les matchs. Par exemple, re.split('a', 'bbabbbab') résultats dans la liste des chaînes ['bb', 'bbb', 'b'] —et re.split('a', 'abbabbbaba') résultats dans la liste des chaînes ['', 'bb', 'bbb', 'b', ''] avec des chaînes vides.

Article connexe : Segment d'expression régulière Python

Méthode 1 :Supprimer toutes les chaînes vides de la liste à l'aide de la compréhension de liste

La solution triviale à ce problème est de supprimer toutes les chaînes vides à partir de la liste résultante en utilisant la list compréhension avec une condition comme [x for x in words if x!=''] pour filtrer la chaîne vide.

import re

s = '--hello-world_how    are\tyou-----------today\t'

# Method 1: Remove all Empty Strings From the List
words = re.split('[-_\s]+', s)
words = [x for x in words if x!='']
print(words)
# ['hello', 'world', 'how', 'are', 'you', 'today']

Méthode 2 :Supprimez toutes les chaînes vides de la liste à l'aide de filter()

Une solution alternative consiste à supprimer toutes les chaînes vides de la liste résultante en utilisant filter() comme filter(bool, words) pour filtrer la chaîne vide '' et d'autres éléments évalués à False comme None .

import re

s = '--hello-world_how    are\tyou-----------today\t'

# Method 2: Remove Empty Strings From List using filter()
words = re.split('[-_\s]+', s)
words = list(filter(bool, words))
print(words)
# ['hello', 'world', 'how', 'are', 'you', 'today']

Méthode 3 :utilisez plutôt re.findall()

Une solution simple et Pythonique consiste à utiliser re.findall(pattern, string) avec le modèle inverse utilisé pour diviser la liste. Si le motif A est utilisé comme motif fractionné, tout ce qui ne correspond pas au motif A peut être utilisé dans le re.findall() fonction pour récupérer essentiellement la liste fractionnée.

Voici l'exemple qui utilise une classe de caractères négative [^-_\s]+ pour trouver tous les caractères qui ne correspondent pas au modèle fractionné :

import re

s = '--hello-world_how    are\tyou-----------today\t'

# Method 3: Use re.findall()
words = re.findall('([^-_\s]+)', s)
print(words)

Le résultat est la même liste fractionnée :

['hello', 'world', 'how', 'are', 'you', 'today']