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

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

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

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

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


当前回答

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

>>> 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中结果相同。

其他回答

s = 'bla, buu, jii'

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

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

>>> 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中结果相同。

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

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

s匹配任何空白字符,我们只是用一个空字符串替换它。你可以在这里找到更多信息:http://docs.python.org/library/re.html#re.sub

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

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

Map (lambda s: s.strip(), mylist)会比显式循环好一点。或者一次性获取全部:map(lambda s:s.strip(), string.split(','))