我正试图通过正则表达式将一串单词分成单词列表。我仍然是一个有正则表达式的初学者。
我正在使用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']
我有一个“表情符号”的解决方法,所以我最关心的是引号。
答案 0 :(得分:1)
似乎所需的输出与输入句子不一致
[u"qu'", u'on']
:我无法弄清楚这两场比赛是从你的判决中确定的u'.'
不属于u'hyper-cool'
(假设您希望将标点符号作为单词的一部分。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匹配和查找的更多信息,我建议您粗略浏览一下py re包。 此外,我不确定在这种情况下,您在多行中继续字符串的方式是否合适。如果您需要更多关于跨行分割字符串的信息(不是多行字符串),请查看this。