2014-11-22 138 views
0

我有一些問題試圖通過標點符號來分割字符串。具體來說,屬於string.punctuation的每個字符。例如,對於串基於標點符號化字符串

輸入:

"Hi. How2 are you doing?? " 

我想的輸出:

['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?') 

供參考string.punctuation是:

'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~' 

我想任何字符在字符串中成爲自己的令牌。

我目前試過使用re.split()。然而,我所能達到的只是基於非單詞字符的分裂。例如:

print([i for i in re.split(r'(\W+)', 'hi. how are you doing') if i]) 

其給出的輸出:

['hi', '. ', 'how', ' ', 'are', ' ', 'you', ' ', 'doing', '??'] 

此外,兩個'??'應當被拆分。有什麼建議麼?

+0

只是一個小的評論,你不需要說[我爲我在re.split(...)如果我] ...「如果我「完全是多餘的,並且如果你真的不能只說print(re.split(...))<我不知道,我不熟悉Python 3的print()或者re模塊的split() )>你可以說print(list(re.split())) – 2014-11-22 19:14:49

回答

1

您可以使用re.findall

>>> import re 
>>> mystr = "Hi. How2 are you doing?? " 
>>> re.findall(r'[.?]|\w+', mystr) 
['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?'] 
>>> 

模式上面發現的.?所有出現,或一系列的一個或多個單詞字符。爲了演示,我保持簡單的模式,但是您想要捕獲的任何其他標點符號將放在字符集[...]內。

此外,您可能希望使用string.punctuation而不是輸入所有這些標點符號。

+0

謝謝!只是我在尋找 – user3750474 2014-11-22 19:01:52

0

NLTK存在:

>>> import nltk 
>>> a = "Hi. How2 are you doing?? " 
>>> nltk.sent_tokenize(a) 
['Hi.', 'How2 are you doing?', '? '] 
>>> nltk.word_tokenize(a) 
['Hi.', 'How2', 'are', 'you', 'doing', '?', '?'] 
>>> map(nltk.word_tokenize,nltk.sent_tokenize(a)) 
[['Hi', '.'], ['How2', 'are', 'you', 'doing', '?'], ['?']] 

我用一個小功能,NLTK是廣闊的,強大的,看看它

+0

但請注意,NLTK是第三方庫。它在Python的標準構建中不可用。 – iCodez 2014-11-22 19:10:17

+0

是的,它是第三方庫,但它存在的目的 – Hackaholic 2014-11-22 19:14:42

+0

很抱歉忘記提及的問題,我想不使用NLTK – user3750474 2014-11-22 19:20:24

0

有點晚了這一點。

你應該可以用split()來做到這一點。

你所做的只是消耗空白,所以其他的東西都在字符之間。

例如:\s+|\b|(?=\pP)將分割(並消耗)空白或字邊界,
或標點符號(在未來的展望中)。

不要了Python與測試,但在Perl

$data =~ s/^\s+//;  # <- trim leading spaces (a Perl problem) 
    my @vals = split /\s+|\b|(?=\pP)/, $data; 

['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?']

以供參考,該原始的正則表達式是一回事

\s+|\b|(?=[!"#$%&'()*+,\-./:;<=>[email protected]\[\\\]^_`{|}~]) 

,但與標點符號在您的列表中。

請注意,反過來是找到所有單詞和標點符號。對於每一個分裂
是一個負面查找所有...