在标点后分割字符串并保留标点

0 投票
1 回答
579 浏览
提问于 2025-04-17 08:32

我正在尝试通过正则表达式把一串单词分割成一个单词列表。我对正则表达式还不是很熟悉。

我正在使用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

看起来你想要的输出和你输入的句子不太一致。

  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模块。另外,我不太确定你在这个场景中多行字符串的连接方式是否合适。如果你需要更多关于如何在行间分割字符串(而不是多行字符串)的信息,请查看 这个链接

撰写回答