web-dev-qa-db-fra.com

Fractionner une chaîne en fonction d'une expression régulière

J'ai la sortie d'une commande sous forme de tableau. J'analyse cette sortie d'un fichier de résultat et 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 un ou plusieurs espaces et le scinder. 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 division, str2 est ajouté à une liste.

114
user2763554

En utilisant (, ), vous capturez le groupe. Si vous les supprimez simplement, vous ne rencontrerez pas ce problème.

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

Cependant, il n’ya pas besoin de regex, str.split sans aucun délimiteur spécifié le séparera par des espaces pour vous. Ce serait le meilleur moyen dans ce cas.

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

Si vous voulez vraiment regex vous pouvez utiliser ceci ('\s' représente les espaces 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']
145
jamylak

La méthode str.split 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

20
Trevor

Lorsque vous utilisez re.split et que le modèle divisé contient des groupes de capture, ceux-ci sont conservés dans la sortie. Si vous ne le souhaitez pas, utilisez plutôt un groupe sans capture.

7
BrenBarn

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

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
2
damned