在Python中用逗号分隔,并去除空白

我有一些python代码,分隔逗号,但不剥离空白:

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

我宁愿最后像这样删除空白:

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

我知道我可以循环遍历列表并strip()每个项,但由于这是Python,我猜有一种更快、更简单和更优雅的方式来完成它。

670533 次浏览

使用列表推导式——更简单,和for循环一样容易阅读。

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]
< p > 看到的: 列表理解中的Python文档 < br > 一个很好的2秒列表理解的解释。 < / p >

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

在分割字符串之前,只需删除字符串中的空白。

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

我知道这个问题已经被回答了,但如果你经常这样做,正则表达式可能是一个更好的方法:

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

\s匹配任何空白字符,我们只需将其替换为空字符串''。你可以在这里找到更多信息:http://docs.python.org/library/re.html#re.sub

使用正则表达式进行拆分。注意,我用前导空格使情况更一般。列表推导式是删除前面和后面的空字符串。

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

看到前面的空格了吗?

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

我是来补充的:

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

但我看到Jason Orendorff已经在一个评论中提到过了。

读Glenn Maynard的对同一个答案进行评论建议在地图上进行列表理解,我开始想知道为什么。我以为他指的是表演方面的原因,但当然,他可能是指风格方面的原因,或者其他什么(格伦?)

因此,在我的盒子(Python 2.6.5 on Ubuntu 10.04)上进行了一个快速(可能有缺陷?)测试,在循环中应用这三个方法:

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


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


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

使得map(str.strip, string.split(','))成为赢家,尽管看起来它们都在同一个球场上。

当然,尽管map(带或不带lambda)不应该因为性能原因被排除,对我来说,它至少和列表理解一样清楚。

s = 'bla, buu, jii'


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

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

瞧!

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

这对我来说很好。

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

简单地说,逗号或至少一个空格,前面/后面没有空格。

请尝试!