Я пытаюсь разобрать строки таким образом, чтобы выделить все компоненты слова, даже те, которые были сокращены. Например, токенизация «не должна» будет [«should», «not»].Python regex: tokenizing английские сокращения
NLTK модуль не кажется, с этой задачей, однако, как:
«Я wouldn't've сделал это.»
размечает как:
[ 'Я', "не будет", "'ве", 'сделано', 'что', "".]
где желаемый токенизация «wouldn't've» была: ['would', "not", "ve"]
После изучения общих английских сокращений я пытаюсь написать регулярное выражение для выполнения задания но мне сложно определить, как совместить «ve» только один раз. Например, следующие маркеры могут все прекратить сокращение:
нет, 'В.Э.,' d 'LL,' s, «м 'ре
Но маркер«' ве»может также следовать за другими сокращениями, такие как:
'd'ве, n't've и (предположительно)' ll've
на данный момент я пытаюсь пререкаться это регулярное выражение:
\ b [a-zA-Z] + (? :('d |' ll | not) ('ve)?) | (' S | 'm |' re | 've) \ Ъ
Тем не менее, эта модель также совпадает с плохо сформированы:
"wouldn't've've"
кажется, проблема заключается в том, что третий апостроф квалифицируется как границы слова, так что конечный токен «ve» соответствует всему регулярному выражению.
Я не мог придумать способ отличить границу слова от апострофа, и, в противном случае, я открыт для консультаций по альтернативным стратегиям.
Кроме того, мне любопытно, есть ли способ включить специальный символ границы слова в класс символов. Согласно документации Python, \ b в символьном классе соответствует обратному пространству, и, похоже, это не так.
EDIT:
Вот результат:
>>>pattern = re.compile(r"\b[a-zA-Z]+(?:('d|'ll|n't)('ve)?)|('s|'m|'re|'ve)\b")
>>>matches = pattern.findall("She'll wish she hadn't've done that.")
>>>print matches
[("'ll", '', ''), ("n't", "'ve", ''), ('', '', "'ve")]
Я не могу понять, третий матч. В частности, я просто понял, что если третий апостроф соответствовал ведущему \ b, то я не знаю, что бы соответствовало классу символов [a-zA-Z] +.
Спасибо. Но это путается: «Она пожелает, чтобы она не сделала этого». и возвращает много посторонних групп в другое время. – Schemer
Можете ли вы привести несколько примеров, чтобы мы знали, что тестировать? Я отредактировал свой код, чтобы он работал с некоторыми из моих примеров и ваших. Демо: https://regex101.com/r/iV4cX6/1 – AMDcze
Ваш взгляд вперед/назад на утверждения указал мне на это: '\ b (? Schemer