用逗号分隔并在Python中删除空格

时间:2010-11-01 17:29:38

标签: python whitespace strip

我有一些python代码在逗号上拆分,但不会删除空格:

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

我宁愿最终删除这样的空格:

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

我知道我可以循环遍历列表并删除()每个项目,但是,因为这是Python,我猜测有更快,更简单,更优雅的方式。

12 个答案:

答案 0 :(得分:488)

使用列表理解 - 更简单,和for循环一样容易阅读。

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

见: Python docs on List Comprehension
A good 2 second explanation of list comprehension.

答案 1 :(得分:21)

使用正则表达式拆分。注意我使用前导空格使案例更加通用。列表理解是删除前面和后面的空字符串。

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

即使^\s+不匹配,这也有效:

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

这就是你需要^ \ s +:

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

查看blah中的前导空格?

澄清:上面使用Python 3解释器,但Python 2中的结果是相同的。

答案 2 :(得分:14)

我来补充道:

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

但看到Jason Orendorff已经在a comment中提到过它。

阅读格伦·梅纳德在同一个答案中的评论,表明对地图的列表理解我开始想知道为什么。我认为他的出于性能原因,但当然他可能是出于文体原因或其他原因(格伦?)。

所以在我的盒子上快速(可能有缺陷?)测试,在循环中应用了这三种方法:

[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

map(str.strip, string.split(','))成为胜利者,虽然看起来他们都在同一个球场。

当然,虽然出于性能原因,不一定要排除map(有或没有lambda),对我而言,它至少与列表理解一样清楚。

编辑:

Ubuntu 10.04上的Python 2.6.5

答案 3 :(得分:11)

在拆分之前,只需从字符串中删除空格。

mylist = my_string.replace(' ','').split(',')

答案 4 :(得分:11)

我知道这已经得到了回答,但是如果你这么做的话,正则表达式可能是更好的方法:

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

\s匹配任何空格字符,我们只需用空字符串''替换它。您可以在此处找到更多信息:http://docs.python.org/library/re.html#re.sub

答案 5 :(得分:2)

s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st

答案 6 :(得分:2)

re(与正则表达式中一样)允许一次拆分多个字符:

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

这对于您的示例字符串不起作用,但适用于以逗号空间分隔的列表。对于您的示例字符串,您可以将re.split功能组合在正则表达式模式上进行拆分,以获得"拆分这个或那个"效果。

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

不幸的是,这很难看,但是filter可以解决这个问题:

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

瞧!

答案 7 :(得分:2)

import re
result=[x for x in re.split(',| ',your_string) if x!='']

这对我来说很好。

答案 8 :(得分:1)

map(lambda s: s.strip(), mylist)会比显式循环好一点。或者对于整个事情:map(lambda s:s.strip(), string.split(','))

答案 9 :(得分:1)

import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

简单地说,逗号或至少一个带/不带前/后空格的空格。

请尝试!

答案 10 :(得分:0)

map(lambda s: s.strip(), mylist)会比明确循环好一点 或者对于整个事情:

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

这基本上就是你需要的一切。

答案 11 :(得分:0)

与其先拆分字符串然后再担心空格,您可以先处理它然后拆分它

string.replace(" ", "").split(",")