Расщепление строки после пунктуации, включая пунктуацию - PullRequest
0 голосов
/ 17 декабря 2011

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

Я использую 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 голос
/ 17 декабря 2011

Кажется, что желаемый результат не соответствует вашему входному предложению

  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, я бы посоветовал вам взглянуть на пакет re python. Также я не уверен, что в этом сценарии уместен способ продолжения строки в несколько строк. Если вам нужна дополнительная информация о разбивке строк по строкам (не многострочных), посмотрите this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...