拆分不带空字符串的python字符串

2024-09-28 23:43:15 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码:

str = 'Welcome\nto\nPythonExamples\nWelcome\nto\nPythonExamples'
chunks = str.split('\n')
print(chunks)

正确打印出:

['Welcome', 'to', 'PythonExamples', 'Welcome', 'to', 'PythonExamples']

我想将字符串拆分为以'Welcome\n'开头的字符串,因此我尝试了以下方法:

str = 'Welcome\nto\nPythonExamples\nWelcome\nto\nPythonExamples'
chunks = str.split('Welcome\n')
print(chunks)

但是这个打印出来:

['', 'to\nPythonExamples\n', 'to\nPythonExamples']

注意第一个条目是如何为空的。 我如何正确地将其拆分,以便输出是正确的

['to\nPythonExamples\n', 'to\nPythonExamples']

Tags: to方法字符串代码条目chunkssplitprint
3条回答

一种非常干净的python方法是使用filter()None。另一方面,str是Python中的关键字,不应将其用作变量名

text = 'Welcome\nto\nPythonExamples\nWelcome\nto\nPythonExamples'
chunks = text.split('Welcome\n')
chunks = filter(None, chunks)
print(list(chunks))
#['to\nPythonExamples\n', 'to\nPythonExamples']

如果我理解正确,您希望避免使用空字符串。 您可以使用列表理解,执行以下操作:

chunks = [x for x in str.split('Welcome\n') if x]

应该能解决你的问题。为什么?

首先,列表理解最后添加了if x,这意味着它将只在列表中包含truthy值(或者更确切地说,将忽略falsy值)

但是为什么你一开始就得到了''?在source code for ^{}处向您指出会更容易:

while (maxcount  > 0) {
    pos = FASTSEARCH(str+i, str_len-i, sep, sep_len, -1, FAST_SEARCH);
    if (pos < 0)
        break;
    j = i + pos;
    SPLIT_ADD(str, i, j);
    i = j + sep_len;
}

基本上,split函数在split(sep)中查找下一次出现的sep,并从上一次出现的maxcount中派生一个子字符串到pos(它将执行maxcount次)。由于您在pos 0中获得了Welcome\n,并且“最后一次出现”为0,因此它将生成一个从0到0的子字符串,这将导致一个空字符串

顺便说一句,对于这样的字符串,您也会得到空字符串:

'Welcome\nWelcome\nto\nPythonExamples\nWelcome\nto\nPythonExamples'

代码的结果,无需我的更改:

['', '', 'to\nPythonExamples\n', 'to\nPythonExamples']

您可以过滤掉空条目。还应避免使用str,因为它是一个内置函数。既然''是假的,你甚至不需要比较

inp = 'Welcome\nto\nPythonExamples\nWelcome\nto\nPythonExamples'
chunks = list(filter(None, inp.split('Welcome\n')))
print(chunks)

相关问题 更多 >