通过拆分字符串创建的python列表中的最后一个元素是空的

Last element in python list, created by splitting a string is empty

所以我有一个字符串需要解析。字符串包含多个单词,由连字符分隔(-)。字符串也以连字符结尾。

例如one-two-three-

现在,如果我想自己看单词,我将字符串拆分成一个列表。

1
2
3
4
5
wordstring ="one-two-three-"
wordlist = wordstring.split('-')

for i in range(0, len(wordlist)):
     print(wordlist[i])

产量

1
2
3
4
one
two
three
#empty element

我不明白的是,为什么在结果列表中,最后一个元素是一个空字符串。如何省略这个空元素?

我应该简单地截断列表还是有更好的方法来拆分字符串?


您有一个空字符串,因为最后一个-字符上的split在rhs上产生一个空字符串。在拆分之前,可以从字符串中删除所有'-'字符:

1
wordlist = wordstring.strip('-').split('-')

可以使用regex执行此操作:

1
2
import re
wordlist = re.findall("[a-zA-Z]+(?=-)", wordstring)

输出:

1
['one', 'two', 'three']


如果最后一个元素总是一个-字符,则可以通过使用[:-1]来省略它,它将获取字符串中除最后一个字符之外的所有元素。

然后,像你做的那样,继续到split

1
2
3
wordlist = wordstring[:-1].split('-')
print(wordlist)
['one', 'two', 'three']

首先是strip(),然后是split()。

1
2
3
4
5
6
wordstring ="one-two-three-"
x = wordstring.strip('-')
y  = x.split('-')

for word in y:
    print word


仅针对不同的选项:

1
wordlist = [x for x in wordstring.split('-') if x]

请注意,上面还处理一些情况,例如:wordstring ="one-two--three-"(双连字符)


这在文档中有解释:

...
If sep is given, consecutive delimiters are not grouped together and are deemed to delimit empty strings (for example, '1,,2'.split(',') returns ['1', '', '2']).
...

如果你知道你的字符串总是以'-'结尾,那么只需通过wordlist.pop()删除最后一个字符串。

如果需要更复杂的内容,您可能需要了解正则表达式。


我相信.split()假设在最后一个-之后还有另一个元素,但它显然是一个空白条目。

在拆分前,您是否愿意删除wordstring中的破折号?

1
2
3
4
5
wordstring ="one-two-three-"
wordlist = wordstring[:-1].split('-')
print wordlist

OUT: 'one-two-three'

在拆分字符串之前,应该使用python的strip内置函数。例如:

1
2
wordstring ="one-two-three-"
wordlist = wordstring.strip('-').split('-')

在分裂前剥去/修剪绳子。这样,您就可以删除尾随的"",并且应该很好。