为什么 split() 结果返回空字符串?
- 2025-02-17 09:24:00
- admin 原创
- 61
问题描述:
'/segment/segment/'.split('/')
回去还有什么意义['', 'segment', 'segment', '']
?
注意空元素。如果你在恰好位于位置 1 且位于字符串末尾的分隔符上进行拆分,那么从两端返回空字符串会给你带来什么额外的价值?
解决方案 1:
str.split
补充str.join
,所以
"/".join(['', 'segment', 'segment', ''])
返回原始字符串。
如果没有空字符串,则'/'
之后的第一个和最后一个字符串将会丢失join()
。
解决方案 2:
更一般地说,要删除split()
结果中返回的空字符串,您可能需要查看该filter
函数。
例子:
f = filter(None, '/segment/segment/'.split('/'))
s_all = list(f)
返回
['segment', 'segment']
解决方案 3:
这里有两个主要考虑点:
期望的结果
'/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(' ')
。
解决方案 4:
我不确定你在寻找什么样的答案?你得到三个匹配项,因为你有三个分隔符。如果你不想要那个空的,只需使用:
'/segment/segment/'.strip('/').split('/')
解决方案 5:
总是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...
字符串方法中的简单性(其中空字符串“是”任何你想要的东西 - 与街头马感相反,也许[[空集,如零等,一直让大多数人感到困惑;-)]],但完全符合显而易见的精炼数学常识!-)。
解决方案 6:
嗯,它让你知道那里有一个分隔符。所以,看到 4 个结果让你知道你有 3 个分隔符。这让你能够用这些信息做任何你想做的事情,而不是让 Python 删除空元素,然后让你手动检查起始或结束分隔符(如果你需要知道的话)。
简单示例:假设您想要检查绝对文件名与相对文件名。这样,您就可以通过拆分完成所有操作,而不必检查文件名的第一个字符是什么。
解决方案 7:
考虑这个最小的例子:
>>> '/'.split('/')
['', '']
split
必须给出分隔符 之前和之后的内容'/'
,但没有其他字符。因此它必须给出空字符串,从技术上讲,该字符串位于 之前和之后'/'
,因为'' + '/' + '' == '/'
。
解决方案 8:
如果您不想返回空格,split
请不带参数使用它。
>>> " this is a sentence ".split()
['this', 'is', 'a', 'sentence']
>>> " this is a sentence ".split(" ")
['', '', 'this', '', '', 'is', '', 'a', 'sentence', '']
解决方案 9:
如果想忽略空行,请在拆分之前始终使用 strip 函数。
youroutput.strip().split('分割器')
例子:
yourstring ='
hey
john
how
are
you'
yourstring.strip().split('
')
解决方案 10:
尝试想出新的方法来做到这一点。这里有一个代码,可以删除所有空格和一些结果。我感兴趣的是,是否可以只在给定字符串的开头和结尾删除它们。
import string
print(list(string.whitespace))
print({ord(c): None for c in string.whitespace})
s = ' Hi Stackoverflow
Mi
x0bhai
Here '
print(s.translate({ord(c): None for c in string.whitespace}))
结果:
[' ', ' ', '
', '
', 'x0b', 'x0c']
{32: None, 9: None, 10: None, 13: None, 11: None, 12: None}
HiStackoverflowMihaiHere
扫码咨询,免费领取项目管理大礼包!