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/groupUnix中的行等等),它允许(如@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('/')