2011-12-17 120 views
0

我试图通过正则表达式将单词串分割成单词列表。我仍然是一个有正则表达式的初学者。包括标点符号在标点符号后分割字符串

我正在使用nltk.regex_tokenize,这是产生的结果是接近,但不是我想要的。

这是我到目前为止有:

>>> import re, codecs, nltk 
>>> sentence = "détesté Rochard ! m'étais à... 'C'est hyper-cool.' :) :P"  
>>> pattern = r"""(?x) 
    #words with internal hyphens 
    | \w+(-\w+)* 
    #ellipsis 
    | \.\.\. 
    #other punctuation tokens 
    | [][.,;!?"'():-_`] 
    """ 
>>> nltk.regexp_tokenize(sentence.decode("utf8"), pattern) 
[u'd\xe9test\xe9', u'Rochard', u'!', u'm', u"'", u'\xe9tais', u'\xe0', u'qu', u"'", u'on', u'...', u"'", u'C', u"'", u'est', u'hyper-cool', u'.', u"'", u':', u')', u':', u'P'] 

我想有如下输出:

[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0', u"qu'", u'on', u'...', u"'", u"C'", u'est', u'hyper-cool', u'.', u"'", u':)', u':P'] 

我对“表情符号”一种解决办法,所以我”最关心的是引号。

回答

1

看来,所需的输出与您的输入句子

  1. [u"qu'", u'on']是一致的:我想不通从哪儿来这两场比赛是从你的句子确定
  2. 为什么u'.'不是一部分的u'hyper-cool'(假设你想要的标点符号作为单词的一部分。
  3. 为什么u"'"不是的u"C'"一部分。(假设你想要的标点符号作为单词的一部分。

此外,如果你只是想正则表达式拆分,是否有任何理由为什么除了拆分线使用nltk?我没有nltk的经验,所以只会提出一个regex解决方案。

>>> sentence 
u"d\xe9test\xe9 Rochard ! m'\xe9tais \xe0... 'C'est hyper-cool.' :) :P" 
>>> pattern=re.compile(
    u"(" #Capturing Group 
    "(?:" #Non Capturing 
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation 
    "[\w\-]+"       #Alphanumeric Unicode Word with hypen 
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation 
    ")" 
    "|(?:[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]+)" #1- punctuation 
    ")",re.UNICODE) 
>>> pattern.findall(sentence) 
[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0.', u'..', u"'C'", u'est', u'hyper-cool.', u"'", u':)', u':P'] 

看看如果你需要捕获组,非捕获组,角色等级,统一匹配的更多信息这对你的作品

和的findall我建议你采取的re包粗略地看一眼的蟒蛇。 另外我不确定在这种情况下是否适合多行连续字符串。如果您需要更多有关跨行分割字符串的信息(不是多行字符串),请查看this

相关问题