我原本期望得到一个空列表,但实际上得到了:
assert 1 == "".split(/\s+/).size()
以及
assert 0 == "".split().size()
我原本期望得到一个空列表,但实际上得到了:
assert 1 == "".split(/\s+/).size()
以及
assert 0 == "".split().size()
tokenize()
替代?assert "".tokenize().size() == 0
assert "foo bar".tokenize() == ['foo', 'bar']
String.split()
也遵循这个规则。请参阅http://docs.python.org/2/library/stdtypes.html#str.split。用下面的CSV数据分割的示例也是有道理的。[str.split()][1]方法有两种算法。如果没有给出任何参数,则它会在重复的空格上进行分割。但是,如果给出了一个参数,则它被视为单个分隔符,没有重复运行。
在分割一个空字符串的情况下,第一种模式(无参数)将返回一个空列表,因为空格被吃掉了,没有值可以放入结果列表中。
相比之下,第二种模式(使用如
\n
这样的参数)将产生第一个空字段。考虑如果您编写了'\n'.split('\n')
,您将得到两个字段(一个分割,给您两个部分)。
>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
,,,USA
'''
>>> for line in data.splitlines():
print(line.split(','))
['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['', '', '', 'USA']
如果不将空字符串''
视为实际值,则不会得到结果['', '', '', 'USA']
而是['USA']
,这并不是您所期望的。