为什么split()返回空字符串?

174 投票
10 回答
116001 浏览
提问于 2025-04-15 18:52

为什么 '/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']
228

str.splitstr.join 的好搭档,所以

"/".join(['', 'segment', 'segment', ''])

这样可以让你得到原来的字符串。

如果没有那些空字符串,使用 join() 后,最前面和最后面的 '/' 就会消失。

撰写回答