Расщепление строки после пунктуации, включая пунктуацию
Я пытаюсь разбить строку слов в список слов с помощью регулярных выражений. Я все еще немного новичок с регулярными выражениями.
Я использую 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 ответ
Кажется, что желаемый результат не соответствует вашему входному предложению
[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 и findall, я бы посоветовал вам бегло взглянуть на пакет python. Также я не уверен, что в этом сценарии уместен способ продолжения строки в несколько строк. Если вам нужна дополнительная информация о разбиении строки на строки (не многострочные), пожалуйста, посмотрите на это.