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.


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']

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


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.