Регулярное выражение для сопоставления отдельных точек, но не чисел или ограничений - PullRequest
0 голосов
/ 01 февраля 2020

Я работаю над предложением и токенизатором для учебника. Это означает разделение строки документа на предложения и предложения на слова. Примеры:

#Sentencizing
"This is a sentence. This is another sentence! A third..."=>["This is a sentence.", "This is another sentence!", "A third..."]
#Tokenizatiion
"Tokens are 'individual' bits of a sentence."=>["Tokens", "are", "'individual'", "bits", "of", "a", "sentence", "."]

Как видно, нужно нечто большее, чем просто string.split (). Я использую re.sub (), добавляя «специальный» тег для каждого соответствия (а затем разделяя его в этом теге), сначала для предложений, а затем для токенов.

Пока это работает отлично, но есть проблема: как сделать регулярное выражение, которое может делиться на точки, но не на (...) или на числа (3.14)?

Я работал с этими опциями с упреждением (Мне нужно сопоставить группу и затем иметь возможность вспомнить ее для добавления), но ни одна не работает:

#Do a negative look behind for preceding numbers or dots, central capture group is a dot, do the same as first for a look ahead.
(?![\d\.])(\.)(?<![\d\.])

Приложение:

sentence = re.sub(pattern, '\g<0>'+special_tag, raw_sentence)

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Я использовал следующее, чтобы найти релевантные периоды:

import re
m = re.compile(r'[0-9]\.[^0-9.]|[^0-9]\.[^0-9.]|[!?]')
st = "This is a sentence. This is another sentence! A third...  Pi is 3.14.  This is 1984.  Hello?"
m.findall(st)

# if you want to use lookahead, you can use something like this:
m = re.compile(r'(?<=[0-9])\.(?=[^0-9.])|(?<=[^0-9])\.(?=[^0-9.])|[!?]')

Это не особенно элегантно, но я также попытался разобраться со случаем: «У нас есть шанс .1% успеха. "

Удачи!

0 голосов
/ 01 февраля 2020

Это может быть излишним, или нужна небольшая очистка, но вот лучшее из регулярных выражений, которое я могу придумать:

((([^\.\n ]+|(\.+\d+))\b[^\.]? ?)+)([\.?!\)\"]+)

Чтобы разбить его:

[^\.\n ]+    // Matches 1+ times any char that isn't a dot, newline or space.
(\.+\d+)     // Captures the special case of decimal numbers
\b[^\.]? ?   // \b is a word boundary. This may be optionally  
             // followed by any non-dot character, and optionally a space.

Все эти предыдущие части соответствуют 1+ раз. Чтобы определить, что предложение закончено, мы используем следующее:

[\.?!\)\"] // Matches any of the common sentences terminators 1+ times

Попробуйте!

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