2014-11-22 96 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]\[\\\]^_`{|}~]) 

,但与标点符号在您的列表中。

请注意,反过来是找到所有单词和标点符号。对于每一个分裂
是一个负面查找所有...