Answers:
str.split
补str.join
,所以
"/".join(['', 'segment', 'segment', ''])
让您返回原始字符串。
如果没有空字符串,则第一个和最后一个字符串'/'
将丢失join()
更一般而言,要删除split()
结果中返回的空字符串,您可能需要查看该filter
函数。
例:
filter(None, '/segment/segment/'.split('/'))
退货
['segment', 'segment']
list(...)
。
这里有两点要考虑:
'/segment/segment/'.split('/')
等['segment', 'segment']
于是合理的,但这会丢失信息。如果split()
按照您想要的方式工作,如果我告诉您a.split('/') == ['segment', 'segment']
,您将无法告诉我是什么a
。'a//b'.split()
?['a', 'b']
?或['a', '', 'b']
?即,是否应split()
合并相邻的定界符?如果需要,那么将很难解析由字符分隔的数据,并且某些字段可以为空。我可以肯定,有很多人确实想要上述情况的结果中的空值!最后,归结为两点:
一致性:如果我有n
定界符,则在中a
,我会在n+1
返回值split()
。
应该可以做复杂的事情,并且可以轻松地做简单的事情:如果由于想要忽略空字符串split()
,可以始终这样做:
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
但是如果不想忽略空值,则应该可以。
该语言必须选择一种定义split()
-有太多不同的用例无法满足所有人的默认要求。我认为Python的选择是不错的选择,也是最合乎逻辑的选择。(顺便说一句,我不喜欢C的原因之一strtok()
是因为它合并了相邻的定界符,因此很难对其进行认真的解析/标记化处理。)
有一个例外:a.split()
没有参数会挤压连续的空格,但是有人可以认为在这种情况下这样做是正确的。如果您不想要这种行为,则可以始终这样做a.split(' ')
。
python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"
->每个循环875纳秒;python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"
->每个循环616 ns
有x.split(y)
始终返回列表1 + x.count(y)
项是一种珍贵的规律性-为@ gnibbler本已指出,这让split
与join
对方的确切逆(因为它们显然应该是),这也正是各种分隔符连记录的语义(映射例如csv
文件行[[引用网络的净额]],/etc/group
Unix中的行等等),它允许(如@Roman的回答所述)轻松检查(例如)绝对路径与相对路径(在文件路径和URL中),等等。
另一种看待它的方式是,您不应该肆意地将信息扔出窗外,以免获得任何好处。x.split(y)
等于会得到什么x.strip(y).split(y)
?没事,当然-它很容易使用第二种形式时,这就是你的意思,但如果第一种形式是任意视为指第二个,你有很多工作要做,当你不希望第一个(如上一段所指出的,这绝非罕见。
但是实际上,根据数学规律进行思考是您可以自学的设计可传递API的最简单,最通用的方法。举一个不同的例子,对于任何有效的x
和y
x == x[:y] + x[y:]
-这立即表明为什么应该排除切片的一个极端非常重要。您可以表述不变的断言越简单,就越有可能产生的语义就是您在现实生活中需要的语义-这是神秘的事实,即数学在处理宇宙中非常有用。
尝试为split
前导和尾随定界符是特殊情况的方言制定不变式...反例:像这样的字符串方法isspace
并不是最大程度的简单- x.isspace()
等效于x and all(c in string.whitespace for c in x)
-愚蠢的前导x and
是您经常发现自己编码的原因not x or x.isspace()
,返回到应该在is...
字符串方法中设计的简单性(因此,空字符串“就是”您想要的任何东西)与街上人马的感觉相反,也许[[空集,如零&c,始终使大多数人感到困惑;-)]],但完全符合明显完善的数学常识!-)。
我不确定您要寻找哪种答案?您得到三个匹配,因为您有三个定界符。如果您不想要那个空的,只需使用:
'/segment/segment/'.strip('/').split('/')