Chaîne fractionnée basée sur une expression régulière

143

J'ai la sortie d'une commande sous forme de tableau. J'analyse cette sortie d'un fichier de résultats et je la stocke dans une chaîne. Chaque élément d'une ligne est séparé par un ou plusieurs caractères d'espacement, j'utilise donc des expressions régulières pour faire correspondre 1 ou plusieurs espaces et les diviser. Cependant, un espace est inséré entre chaque élément:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

Y a-t-il une meilleure manière de faire cela?

Après chaque fractionnement str2est ajouté à une liste.

user2763554
la source
1
J'ai rejeté cette question. La raison est que si la question elle-même est pertinente, l'exemple donné n'est pas assez difficile pour vraiment exiger la solution demandée. Une expression régulière serait nécessaire si vous avez par exemple des blocs de mots, des blocs de nombres et que vous souhaitez les séparer en différentes variables.
erikbwork
@erikbwork Je voulais supprimer l'élément d'espace indésirable dans la chaîne résultante'str2'
user2763554
1
Oui et vous pouvez y parvenir simplement en utilisant str1.split(). Pas besoin de regex.
erikbwork

Réponses:

176

En utilisant (, )vous capturez le groupe, si vous les supprimez simplement, vous n'aurez pas ce problème.

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

Cependant, il n'y a pas besoin de regex, str.splitsans aucun délimiteur spécifié, cela divisera cela par un espace pour vous. Ce serait la meilleure façon dans ce cas.

>>> str1.split()
['a', 'b', 'c', 'd']

Si vous vouliez vraiment regex, vous pouvez utiliser ceci ( '\s'représente un espace et c'est plus clair):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

ou vous pouvez trouver tous les caractères non blancs

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
Jamylak
la source
4
Rester simple. str.splitest certainement le meilleur: D
jamylak
Comment puis-je utiliser cela si j'ai une chaîne qui commence et se termine par withspace. exemple: 'abc de'. Pour cela, la sortie vient comme['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish
@RakholiyaJenishstr1.split()
jamylak
@jamylak string.split()est une option. Je demandais si cela pouvait être fait avec regex aussi?
Rakholiya Jenish
2
@RakholiyaJenish Ne pouvez-vous pas utiliser l' re.findalloption?
jamylak
24

La str.splitméthode supprimera automatiquement tout espace blanc entre les éléments:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

Les documents sont ici: http://docs.python.org/library/stdtypes.html#str.split

Trevor
la source
1
@ GururajY.S .: str.split()est probablement le meilleur choix pour quelque chose d'aussi léger que celui-ci.
Joel Cornett du
7

Lorsque vous utilisez re.splitet que le modèle de division contient des groupes de capture, les groupes sont conservés dans la sortie. Si vous ne le souhaitez pas, utilisez plutôt un groupe non capturant.

BrenBarn
la source
2
L'utilisation str.splitest probablement meilleure pour votre exemple. Je voulais juste expliquer pourquoi tu as le comportement que tu as.
BrenBarn
2

C'est très simple en fait. Essaye ça:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
damné
la source
2
Je donnerais +1 mais vous utilisez des points-virgules laids.
jamylak
3
@jamylak Lol. Je vais les changer. :) Habit à utiliser java et python!
damné le
1
@ GururajY.S. Si vous souhaitez simplement diviser en fonction de l'espace, vous devez simplement utiliserstringToSplit.split()
maudit