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']

我有一个“表情符号”的解决方法,所以我最关心的是引号。

4

1 回答 1

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']

看看这是否适合你

如果您需要更多关于捕获组、非捕获组、字符类、Unicode 匹配和 findall 的信息,我建议您粗略浏览一下 python 的re包。此外,我不确定您在多行中继续字符串的方式在这种情况下是否合适。如果您需要有关跨行拆分字符串(不是多行字符串)的更多信息,请查看.

于 2011-12-17T07:55:05.927 回答