Answers:
使用列表理解-更简单,就像for
循环一样容易阅读。
my_string = "blah, lots , of , spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]
使用正则表达式拆分。注意我用前导空格使情况更一般。列表理解是删除前面和后面的空字符串。
>>> 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相同。
[x.strip() for x in my_string.split(',')]
对于提出的问题来说,它更具Python性。也许在某些情况下我的解决方案是必要的。如果碰到一个内容,我将对其进行更新。
^\s+
必要?我已经在没有它的情况下测试了您的代码,但它不起作用,但是我不知道为什么。
re.compile("^\s*,\s*$")
,结果是[' blah, lots , of , spaces, here ']
。
^\s+
制造。如您所见,^\s*,\s*$
也不会返回期望的结果。因此,如果您想使用正则表达式进行拆分,请使用^\s+|\s*,\s*|\s+$
。
我来补充:
map(str.strip, string.split(','))
但是看到Jason Orendorff在评论中已经提到了它。
在同一个答案中读到格伦·梅纳德(Glenn Maynard)的评论,这暗示着人们对地图的理解,我开始怀疑为什么。我以为他是出于性能方面的考虑,但是当然他可能是出于风格方面的原因,或者其他原因(Glenn?)。
因此,在我的盒子上快速地(可能有缺陷?)应用了以下三种方法的测试:
[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
分割字符串之前,只需从字符串中删除空格。
mylist = my_string.replace(' ','').split(',')
"you just, broke this"
。
我知道已经回答了这个问题,但是如果您结束很多工作,则使用正则表达式可能是更好的选择:
>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']
将\s
匹配任何空白字符,我们只是用一个空字符串替换它''
。您可以在此处找到更多信息:http : //docs.python.org/library/re.html#re.sub
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',
'']
不幸的是,这很丑陋,但是a filter
会成功的:
$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']
瞧!
re.split(' *, *', string)
呢?
re.split('[, ]*',string)
达到相同的效果。
[, ]*
在列表末尾留下了一个空字符串。我认为过滤器仍然是不错的选择,或者像顶级答案一样坚持列表理解。
map(lambda s: s.strip(), mylist)
比显式循环要好一点。或一次全部:map(lambda s:s.strip(), string.split(','))
map
,尤其是如果您正在使用lambda
它,请仔细检查以查看是否应该使用列表推导。
map(str.strip, s.split(','))
。
s = 'bla, buu, jii'
sp = []
sp = s.split(',')
for st in sp:
print st
map(lambda s: s.strip(), mylist)
比显式循环要好一点。
或一次全部:
map(lambda s:s.strip(), string.split(','))
这基本上就是您需要的一切。