使用已知分隔符强制Python空分割算法

使用已知分隔符强制Python空分割算法,python,split,Python,Split,在修复代码中的一个bug时,我最近发现Python有两种截然不同的分割算法 如果没有提供分离器,则使用一个,如: >>> ' a b c '.split() ['a', 'b', 'c'] 换句话说,它在任何预定义的空白字符序列上拆分,并忽略前导和尾随空白 另一个在提供分隔符列表时使用,如: >>> ' a b c '.split(' ') ['', '', 'a', '', 'b', '', 'c', '', ''] 这一个在分隔符字符串

在修复代码中的一个bug时,我最近发现Python有两种截然不同的分割算法

如果没有提供分离器,则使用一个,如:

>>> '  a  b  c  '.split()
['a', 'b', 'c']
换句话说,它在任何预定义的空白字符序列上拆分,并忽略前导和尾随空白

另一个在提供分隔符列表时使用,如:

>>> '  a  b  c  '.split(' ')
['', '', 'a', '', 'b', '', 'c', '', '']
这一个在分隔符字符串的每次出现时都会被拆分

您可能会注意到,这两种算法实际上非常不同。第一个不会在结果列表中创建空字符串,例如,另一个是可反转的,可以使用
sep.join(list)
进行反转,这对于没有参数的版本是不正确的

用同一个名字调用两个完全不同的函数有点烦人,但我能理解其原理

但是,当我有一组不同于默认的分隔符时,有没有简单的方法强制使用第一个算法

我的用例是,我的输入字符串也包含其他有效分隔符(在我的例子中是“\0”)

不好,\0不作为空白分隔符

>>> ' a \0 b \0 c \0 '.split('\0')
[' a ', ' b ', ' c ', ' ']
不好的“”保留在拆分的字符串中

>>> ' a \0 b \0 c \0 '.split('\0 ')
[' a ', 'b ', 'c ', '']
在后跟空格的\0序列上拆分,而不是我想要的

到目前为止,我发现最好的代码如下:

>>> import re
>>> [x for x in re.split(' |\0',' a \0 b c \0 c \0 ') if x]
['a', 'b', 'c', 'c']
它能工作,做我想做的,但它看起来太过分了


有没有更简单的方法?或者在split()中配置python用作默认分隔符列表而不带参数的方法?

您可以改变逻辑,告诉正则表达式查找所有不是分隔符的内容:

>>> re.findall('[^ \0]+',' a \0 b c \0 c \0 ')
['a', 'b', 'c', 'c']

您可以将所有字符串的
\0
字符替换为
split()
前面的空白:


谢谢,它比我的简单多了。它仍然在复制字符串两次。是的,它确实需要执行
replace()
,然后为
split()
再次处理字符串,但我不会担心这一点,直到它开始为您的项目造成不可接受的性能问题。我同意。至少它不必进口稀土。我不在乎性能问题。但它只在\t或\n也被接受的分隔符(这对我来说是可以的)的情况下才起作用。好的,你的问题说你想在默认值中添加有效的分隔符,这就是这个答案所实现的效果,所以看起来很好。:)
>>> re.findall('[^ \0]+',' a \0 b c \0 c \0 ')
['a', 'b', 'c', 'c']
>>> ' a \0 b \0 c \0 '.replace('\0', ' ').split()
['a', 'b', 'c']