Расщепление строки после пунктуации, включая пунктуацию

Я пытаюсь разбить строку слов в список слов с помощью регулярных выражений. Я все еще немного новичок с регулярными выражениями.

Я использую 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']

Посмотрите, работает ли это для вас

Если вам нужна дополнительная информация о группе захвата, группе без захвата, классе символов, сопоставлении Unicode и findall, я бы посоветовал вам бегло взглянуть на пакет python. Также я не уверен, что в этом сценарии уместен способ продолжения строки в несколько строк. Если вам нужна дополнительная информация о разбиении строки на строки (не многострочные), пожалуйста, посмотрите на это.

Другие вопросы по тегам