如何将字符串拆分为列表?


574

我希望我的Python函数拆分一个句子(输入)并将每个单词存储在列表中。我当前的代码拆分了句子,但没有将单词存储为列表。我怎么做?

def split_line(text):

    # split the text
    words = text.split()

    # for each word in the line:
    for word in words:

        # print the word
        print(words)

1
此代码的哪一部分不起作用?您能否提供错误消息或遇到的问题?
S.Lott

4
照原样,您将为列表中的每个单词打印单词的完整列表。我认为您打算将其print(word)用作最后一行。
tgray

Answers:


487
text.split()

这应该足以将每个单词存储在列表中。 words已经是句子中单词的列表,因此不需要循环。

其次,这可能是一个错字,但是您的循环有点混乱。如果您确实确实想使用附加,它将是:

words.append(word)

word.append(words)

447

text在任何连续的空格运行中拆分字符串。

words = text.split()      

text在分隔符上分割字符串","

words = text.split(",")   

单词变量将为a,list并包含text分隔符上的split 单词。


86

str.split()

返回字符串中的单词列表,使用sep作为定界符...如果未指定sep或为None,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,并且结果将包含如果字符串的开头或结尾有空格,则开头或结尾不得有空字符串。

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 


52

根据您打算如何处理列表中的句子,您可能需要查看Natural Language Took Kit。它主要处理文本处理和评估。您也可以使用它来解决您的问题:

import nltk
words = nltk.word_tokenize(raw_sentence)

这具有将标点符号分开的额外好处。

例:

>>> import nltk
>>> s = "The fox's foot grazed the sleeping dog, waking it."
>>> words = nltk.word_tokenize(s)
>>> words
['The', 'fox', "'s", 'foot', 'grazed', 'the', 'sleeping', 'dog', ',', 
'waking', 'it', '.']

这使您可以过滤掉不需要的标点,而仅使用单词。

请注意,string.split()如果您不打算对句子进行任何复杂的处理,则使用其他解决方案会更好。

[编辑]


5
split()依靠空白作为分隔符,因此它将无法分隔连字词-并且长破折号分隔的短语也将无法分隔。而且如果句子中包含没有空格的标点符号,这些标点符号将无法粘贴。对于任何现实世界中的文本解析(例如此注释),您的nltk建议都比split()好得多。
滚刀

2
可能有用,尽管我不会将其描述为“单词”。通过任何纯英文释义,','"'s"不是单词。通常,如果您想以标点符号识别的方式将上述句子拆分为“单词”,则需要去除逗号并得到"fox's"一个单词。
Mark Amery

1
截至2016
AnneTheAgile

31

这个算法怎么样?在空白处分割文本,然后修剪标点符号。这会仔细删除单词边缘的标点符号,而不会损害单词内的撇号,例如we're

>>> text
"'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"

>>> text.split()
["'Oh,", 'you', "can't", 'help', "that,'", 'said', 'the', 'Cat:', "'we're", 'all', 'mad', 'here.', "I'm", 'mad.', "You're", "mad.'"]

>>> import string
>>> [word.strip(string.punctuation) for word in text.split()]
['Oh', 'you', "can't", 'help', 'that', 'said', 'the', 'Cat', "we're", 'all', 'mad', 'here', "I'm", 'mad', "You're", 'mad']

4
不错,但是有些英语单词确实包含结尾标点符号。例如,和中的结尾点e.g.Mrs.所有格中的结尾撇号frogs'(如中的frogs' legs)是单词的一部分,但是将被该算法删除。处理缩写正确地可以大致通过检测点分隔initialisms加上使用的特殊情况下(像字典来实现Mr.Mrs.)。从单引号中区分所有格撇号要困难得多,因为它需要解析包含该单词的句子的语法。
Mark Amery

2
@MarkAmery你是对的。从那时起,我还发现有些标点符号(例如破折号)可以分隔单词而没有空格。
上校恐慌

16

我希望我的python函数拆分一个句子(输入)并将每个单词存储在列表中

str().split()方法执行此操作,它需要一个字符串,并将其拆分为一个列表:

>>> the_string = "this is a sentence"
>>> words = the_string.split(" ")
>>> print(words)
['this', 'is', 'a', 'sentence']
>>> type(words)
<type 'list'> # or <class 'list'> in Python 3.0

您遇到的问题是由于输入错误,print(words)而不是您写的print(word)

word变量重命名为current_word,这就是您所拥有的:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(words)

..什么时候应该完成:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(current_word)

如果出于某种原因要在for循环中手动构造列表,则可以使用list append()方法,也许是因为您想对所有单词都小写(例如):

my_list = [] # make empty list
for current_word in words:
    my_list.append(current_word.lower())

或者使用list-comprehension更加整洁:

my_list = [current_word.lower() for current_word in words]

12

shlex具有.split()功能。它的不同之处str.split()在于,它不保留引号,并且将带引号的词组视为一个单词:

>>> import shlex
>>> shlex.split("sudo echo 'foo && bar'")
['sudo', 'echo', 'foo && bar']

10

如果要在列表中包含单词/句子的所有字符,请执行以下操作:

print(list("word"))
#  ['w', 'o', 'r', 'd']


print(list("some sentence"))
#  ['s', 'o', 'm', 'e', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.