จะแยกสตริงออกเป็นรายการได้อย่างไร?


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

คำตอบ:


487
text.split()

นี่ควรจะเพียงพอที่จะเก็บแต่ละคำในรายการ wordsเป็นรายการของคำจากประโยคอยู่แล้วดังนั้นจึงไม่จำเป็นต้องวนซ้ำ

ประการที่สองมันอาจเป็นตัวพิมพ์ผิด แต่คุณวนลูปเล็กน้อย หากคุณไม่ต้องการใช้ผนวกจริง ๆ มันจะเป็น:

words.append(word)

ไม่

word.append(words)

447

แบ่งสตริงในtextช่องว่างใด ๆ ที่ต่อเนื่อง

words = text.split()      

แยกสตริงในในตัวคั่น:text","

words = text.split(",")   

คำว่าตัวแปรจะเป็นlistและมีคำที่textแยกจากตัวคั่น


86

str.split ()

ส่งคืนรายการคำในสตริงโดยใช้ sep เป็นตัวคั่น ... หากไม่ได้ระบุ sep หรือเป็น None จะใช้อัลกอริทึมการแยกที่แตกต่างกัน: การรันของช่องว่างต่อเนื่องจะถือว่าเป็นตัวคั่นเดียวและผลลัพธ์จะมี ไม่มีสตริงว่างที่จุดเริ่มต้นหรือสิ้นสุดหากสตริงมีช่องว่างนำหน้าหรือต่อท้าย

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

@warvariuc - ควรเชื่อมโยงกับdocs.python.org/2/library/stdtypes.html#str.split
gimel

52

ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณวางแผนจะทำอย่างไรกับประโยค as-a-รายการของคุณคุณอาจต้องการที่จะดูที่เอาชุดภาษาธรรมชาติ มันเกี่ยวข้องอย่างมากกับการประมวลผลข้อความและการประเมินผล คุณสามารถใช้เพื่อแก้ปัญหาของคุณ:

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


31

อัลกอริทึมนี้เป็นอย่างไร แยกข้อความบนช่องว่างแล้วตัดเครื่องหมายวรรคตอน นี้อย่างระมัดระวังเอาเครื่องหมายวรรคตอนจากขอบของคำโดยไม่ทำร้าย apostrophes 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) เป็นส่วนหนึ่งของคำ แต่จะถูกปล้นโดยอัลกอริทึมนี้ การจัดการตัวย่ออย่างถูกต้องสามารถทำได้คร่าวๆโดยการตรวจหาการเริ่มต้นจุดที่คั่นด้วยการใช้พจนานุกรมของกรณีพิเศษ (เช่นMr., Mrs.) การแยกความแตกต่างของเครื่องหมายอะโพสโทรฟีจากเครื่องหมายคำพูดเดี่ยวนั้นยากกว่ามากเนื่องจากต้องแยกไวยากรณ์ของประโยคที่มีคำนั้นอยู่
Mark Amery

2
@ MarkAmery คุณพูดถูก มันก็เกิดขึ้นกับฉันเช่นกันว่าเครื่องหมายวรรคตอนบางอย่าง - เช่นประประ - สามารถแยกคำโดยไม่มีช่องว่าง
พันเอก Panic

16

ฉันต้องการฟังก์ชั่นหลามของฉันเพื่อแบ่งประโยค (อินพุต) และเก็บแต่ละคำในรายการ

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 for loop คุณจะต้องใช้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']

4

ฉันคิดว่าคุณสับสนเพราะพิมพ์ผิด

แทนที่print(words)ด้วยprint(word)ภายในวงของคุณเพื่อให้ทุกคำที่พิมพ์บนบรรทัดที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.