Split par virgule et strip whitespace en Python

j'ai un code python qui se divise en virgule, Mais qui ne supprime pas l'espace:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

je préférerais finir avec un espace enlevé comme ceci:

['blah', 'lots', 'of', 'spaces', 'here']

je suis conscient que je pourrais boucler la liste et rayer() chaque item mais, comme C'est Python, je devine qu'il y a une façon plus rapide, plus facile et plus élégante de le faire.

245
demandé sur Eric Leschinski 2010-11-01 20:29:37

11 réponses

utilise la compréhension de liste -- plus simple, et aussi facile à lire qu'une boucle for .

my_string = "blah, lots  ,  of ,  spaces, here "
[x.strip() for x in my_string.split(',')]

Voir: Python docs sur la Compréhension de Liste

Un bon 2 deuxième explication de la compréhension de liste.

422
répondu Sean Vieira 2017-05-23 12:10:34

Split à l'aide d'une expression régulière. Remarque j'ai fait le cas le plus général, avec de grands espaces. La compréhension de liste est de supprimer les chaînes vides à l'avant et à l'arrière.

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

cela fonctionne même si ^\s+ ne correspond pas:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

Voici pourquoi vous avez besoin de ^\s+:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

voir les espaces principaux en blah?

Clarification: ci-dessus utilise le Python 3 interprète, mais les résultats sont les mêmes en Python 2.

20
répondu tbc0 2016-07-23 22:06:58

je sais que cela a déjà été répondu, mais si vous finissez de faire cela beaucoup, les expressions régulières peuvent être une meilleure façon d'aller:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

le \s correspond à n'importe quel caractère d'espace, et nous le remplaçons par une chaîne vide '' . Vous pouvez trouver plus d'informations ici: http://docs.python.org/library/re.html#re.sub

11
répondu Brad Montgomery 2012-02-01 05:30:22

je suis venu pour ajouter:

map(str.strip, string.split(','))

mais vu Qu'il avait déjà été mentionné par Jason Orendorff dans un commentaire .

en lisant le commentaire de Glenn Maynard dans la même réponse suggérant des interprétations de listes sur la carte, j'ai commencé à me demander pourquoi. J'ai supposé qu'il voulait dire pour des raisons de performance, mais bien sûr il aurait pu vouloir dire pour des raisons de style, ou autre chose (Glenn?).

pour une rapide (éventuellement défectueux?) test sur ma boîte appliquant les trois méthodes dans une boucle révélé:

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

faire map(str.strip, string.split(',')) le vainqueur, bien qu'il semble qu'ils sont tous dans le même stade.

certes, bien que map (avec ou sans lambda) ne devrait pas nécessairement être exclu pour des raisons de performance, et pour moi, il est au moins aussi clair qu'une compréhension de liste.

Edit:

Python 2.6.5 sur Ubuntu 10.04

11
répondu Sean 2017-05-23 12:10:34

il suffit d'enlever l'espace blanc de la corde avant de la fendre.

mylist = my_string.replace(' ','').split(',')
6
répondu user489041 2010-11-01 18:26:37
import re
result=[x for x in re.split(',| ',your_string) if x!='']

ça me va très bien.

2
répondu Zieng 2015-06-02 11:57:50

re (comme dans les expressions régulières) permet de diviser sur plusieurs caractères à la fois:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

cela ne fonctionne pas bien pour votre chaîne d'exemple, mais fonctionne bien pour une liste séparée par une virgule. Pour votre exemple string, vous pouvez combiner le re.split pouvoir de se diviser sur modèles regex pour obtenir un "split-sur-cette-ou -".

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

malheureusement, c'est moche, mais un filter fera l'affaire. le truc:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

voilà!

2
répondu Dannid 2015-08-18 19:08:53

map(lambda s: s.strip(), mylist) serait un peu mieux qu'une boucle explicite. Ou pour toute la chose à la fois: map(lambda s:s.strip(), string.split(','))

1
répondu user470379 2010-11-01 17:31:29
s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
1
répondu Parikshit Pandya 2015-01-31 02:53:27
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

simplement, virgule ou au moins un espace blanc avec/sans espaces blancs précédents/successifs.

essayez s'il vous plaît!

1
répondu GyuHyeon Choi 2017-05-05 02:49:36

map(lambda s: s.strip(), mylist) serait un peu mieux qu'une boucle explicite.

Ou pour toute la chose à la fois:

map(lambda s:s.strip(), string.split(','))

c'est tout ce dont tu as besoin.

0
répondu DJbigpenis 2017-01-09 12:52:22