为什么split()返回空字符串?
为什么 '/segment/segment/'.split('/')
会返回 ['', 'segment', 'segment', '']
呢?
注意到这个结果里有空的元素。如果你用一个分隔符去分割字符串,而这个分隔符恰好在字符串的开头和结尾,那么返回这两个空字符串有什么额外的意义呢?
10 个回答
37
这里有两个主要的观点需要考虑:
- 期待
'/segment/segment/'.split('/')
的结果是['segment', 'segment']
是合理的,但这样会丢失一些信息。如果split()
按照你想要的方式工作,当我告诉你a.split('/') == ['segment', 'segment']
时,你就无法知道a
是什么了。 - 那么
'a//b'.split()
的结果应该是什么呢?是['a', 'b']
还是['a', '', 'b']
?也就是说,split()
是否应该合并相邻的分隔符?如果应该合并,那就很难解析那些用某个字符分隔的数据,因为有些字段可能是空的。我相信很多人确实希望在这种情况下结果中包含空值!
最后,这归结为两件事:
一致性:如果我在 a
中有 n
个分隔符,经过 split()
后我应该得到 n+1
个值。
复杂的事情应该可以做到,简单的事情也应该容易:如果你想忽略 split()
结果中的空字符串,你可以这样做:
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
但是如果有人不想忽略空值,他们也应该能够做到。
编程语言必须选择一种 split()
的定义——因为有太多不同的使用场景,无法满足每个人的需求。我认为 Python 的选择是一个不错的决定,也是最合逻辑的。(顺便提一下,我不喜欢 C 的 strtok()
的原因之一就是它会合并相邻的分隔符,这让进行严肃的解析和分词变得非常困难。)
有一个例外:a.split()
在没有参数的情况下会压缩连续的空白字符,但可以说在这种情况下这样做是正确的。如果你不想要这种行为,你可以使用 a.split(' ')
。
150
更一般来说,如果你想去掉在使用 split()
函数时返回的空字符串,可以考虑使用 filter
函数。
举个例子:
f = filter(None, '/segment/segment/'.split('/'))
s_all = list(f)
返回结果是
['segment', 'segment']