2012-03-21 37 views
5

Tôi đang cố gắng chia chuỗi thành các từ, xóa dấu cách và dấu chấm câu.Chia chuỗi tại các dấu chấm câu khác nhau bằng cách sử dụng split()

tôi đã cố gắng sử dụng phương pháp split(), đi qua tất cả các dấu chấm câu cùng một lúc, nhưng kết quả của tôi là không đúng:

>>> test='hello,how are you?I am fine,thank you. And you?' 
>>> test.split(' ,.?') 
['hello,how are you?I am fine,thank you. And you?'] 

Tôi thực sự biết làm thế nào để làm điều này với regexes đã có, nhưng tôi muốn tìm ra làm thế nào để làm điều đó bằng cách sử dụng split(). Xin vui lòng không cho tôi một giải pháp regex.

+2

Vì vậy, bạn nhấn mạnh vào việc sử dụng cờ lê để lái móng tay, trong khi búa đang ở trong tầm tay. Tại sao? –

+0

Không có nghĩa là không tôn trọng OP Tôi nghĩ rằng nên có một thẻ cho các loại câu hỏi trong đó công cụ thích hợp được snubbed vì lý do gì (đôi khi hợp lệ), họ đi lên theo thời gian. Có lẽ 'luddism'? –

+0

thử C# "xin chào, bạn thế nào? Tôi ổn, cảm ơn bạn. Và bạn?". Split (",.". ToCharArray(), StringSplitOptions.RemoveEmptyEntries); –

Trả lời

10

Đây là cách tốt nhất mà tôi có thể nghĩ đến mà không sử dụng các mô-đun lại:

"".join((char if char.isalpha() else " ") for char in test).split() 
+0

Ooo, đó là một cách khác để làm điều đó, mặc dù nó không sử dụng danh sách ký tự phân tách rõ ràng ... – larsks

+0

mã của bạn tốt hơn, nó có thể xử lý các dấu câu khác – leisurem

+0

Điều này thật tuyệt. Mặc dù, nó hơi kém hiệu quả so với việc sử dụng re.split. –

11

Nếu bạn muốn chia một chuỗi dựa trên nhiều delimiters, như trong ví dụ của bạn, bạn sẽ cần phải sử dụng các mô-đun re bất chấp sự phản đối kỳ lạ của mình, như thế này:

>>> re.split('[?.,]', test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 

Đó là có thể để nhận kết quả tương tự bằng cách sử dụng split, nhưng bạn cần phải gọi chia một lần cho mỗi ký tự và bạn cần lặp lại kết quả của lần chia trước đó. Này hoạt động nhưng nó u-g-l-y:

>>> sum([z.split() 
... for z in sum([y.split('?') 
... for y in sum([x.split('.') 
... for x in test.split(',')],[])], [])], []) 
['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you'] 

này sử dụng sum() để san bằng danh sách trả về bởi phiên trước.

+0

Vui lòng không sử dụng 'sum()' để làm phẳng danh sách các danh sách - [đó là công cụ sai cho mục đích này] (http://stackoverflow.com/questions/952914/making-a-flat-list-out- danh sách-of-lists-in-python/952952 # 952952). Trong trường hợp đặc biệt này, thậm chí nhiều hơn như vậy, vì một [danh sách duy nhất hiểu bằng cách sử dụng một vòng lặp lồng nhau] (http://ideone.com/xEXX7) sẽ loại bỏ sự cần thiết phải san phẳng ở nơi đầu tiên. –

+0

Bạn được hoan nghênh đăng một giải pháp thay thế nếu bạn tin rằng giải pháp đó phù hợp hơn với vấn đề. – larsks

+0

Miễn là OP không giải thích tại sao 're' không nên được sử dụng, tôi sẽ không đăng câu trả lời vì tôi chưa hiểu mục đích của câu hỏi. Tuy nhiên, liên kết thứ hai trong bình luận cuối cùng của tôi cho thấy một giải pháp thay thế. –

6

Vì bạn không muốn sử dụng các mô-đun lại, bạn có thể sử dụng này:

test.replace(',',' ').replace('.',' ').replace('?',' ').split() 
+0

test = 'Xin chào, bạn khoẻ không? Tôi ổn, cảm ơn bạn. Còn bạn?' cho x trong thử nghiệm: nếu không x.isalpha(): test = test.replace (x,' ') test = test.split() kiểm tra in – leisurem

3

bạn có thể viết một hàm để mở rộng việc sử dụng của .split():

def multi_split(s, seprators): 
    buf = [s] 
    for sep in seprators: 
     for loop, text in enumerate(buf): 
      buf[loop:loop+1] = [i for i in text.split(sep) if i] 
    return buf 

Và thử nó:

>>> multi_split('hello,how are you?I am fine,thank you. And you?', ' ,.?') ['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you']

này sẽ được rõ ràng hơn nhiều và có thể được sử dụng trong các tình huống khác.

3

Một phiên bản sửa đổi của câu trả lời larsks', nơi mà bạn không cần phải gõ tất cả các ký tự dấu mình:

import re, string 

re.split("[" + string.punctuation + "]+", test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 
0

Xin lỗi cho necroing - chủ đề này đi lên như là kết quả đầu tiên cho tách phi regex của một câu. Thấy như tôi đã phải đưa ra một phương pháp không Python cụ thể cho sinh viên của tôi, và rằng thread này đã không trả lời câu hỏi của tôi, tôi nghĩ rằng tôi sẽ chia sẻ chỉ trong trường hợp.

Điểm của mã là sử dụng không có thư viện (và nó nhanh chóng trên các tập tin lớn):

sentence = "George Bernard-Shaw was a fine chap, I'm sure - who can really say?" 
alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
words = [] 
word = "" 
mode = 0 
for ch in sentence: 
    if mode == 1: 
     words.append(word) 
     word = "" 
     mode = 0 
    if ch in alpha or ch == "'" or ch == "-": 
     word += ch 
    else: 
     mode = 1 
words.append(word) 
print(words) 

Output:

['George', 'Bernard-Shaw', 'was', 'a', 'fine', 'chap', "I'm", 'sure', '-', 'who', 'can', 'really', 'say'] 

Tôi có nghĩa là chỉ bằng văn bản này trong khoảng nửa giờ đồng hồ vì vậy tôi chắc chắn rằng logic có thể được làm sạch.Tôi cũng đã thừa nhận rằng nó có thể yêu cầu logic bổ sung để đối phó với các dấu nhắc như dấu gạch nối chính xác, vì việc sử dụng chúng không nhất quán so với một cái gì đó giống như dấu phẩy ngược. Có bất kỳ mô-đun, thực sự, mà có thể làm điều này một cách chính xác không?

Các vấn đề liên quan