用逗号分割并在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,我猜测有一个更快,更简单,更优雅的方式来做到这一点。

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

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

请参阅: 关于列表理解的Python文档
列表理解的好的2秒的解释。

使用正则expression式分割。 请注意,我把这个例子与领先的空格进行了比较。 列表理解是去除前面和后面的空string。

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

我知道这已经被回答了,但是如果你这样做了很多,正则expression式可能是更好的select:

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

\s匹配任何空白字符,我们只是用一个空string''replace它。 你可以在这里find更多的信息: http : //docs.python.org/library/re.html#re.sub

我来补充一下:

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

但是看到Jason Orendorff在评论中已经提到过它。

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

所以在一个循环中应用三种方法的快速(可能有缺陷?)testing显示:

 [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(','))的胜利者,虽然看起来他们都在同一个球场。

当然,虽然地图(有或没有拉姆达)不应该排除出于性能的原因,对我来说,至less清晰的列表理解。

编辑:

Ubuntu 10.04上的Python 2.6.5

在分割之前,只需从string中删除空格。

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

这对我来说工作得很好。

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

re (如在正则expression式中)允许一次分割多个字符:

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

这对你的示例string不起作用,但对逗号分隔的列表很好。 对于你的例子string,你可以结合re.split的function来分割正则expression式模式来获得“分裂这或那”的效果。

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

不幸的是,这是丑陋的,但filter将做到这一点:

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

瞧!

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

简单地说,逗号或至less有一个空白/有前/后空白。

请尝试!

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

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

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

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

从string中删除空格,然后您可以拆分它。

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