Regex, чтобы найти предложения минимальной длины - PullRequest
0 голосов
/ 09 апреля 2020

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

На самом деле мои условия таковы:

  1. в последовательности должно быть не менее 5 слов
  2. слова в последовательности должны отличаться
  3. за последовательностью должен следовать какой-то знак пунктуации.

До сих пор я пытался

^(\b\w*\b\s?){5,}\s?[.?!]$

Если мой образец текста:

This is a sentence I would like to parse.

This is too short. 

Single word

Not not not distinct distinct words words.

Another sentence that I would be interested in. 

Я бы хотел сопоставить строки 1 и 5.

Я использую python повторная библиотека. Я использую regex101 для тестирования, и кажется, что приведенное выше регулярное выражение выполняет довольно много работы в отношении возврата, поэтому я полагаю, что те, кто знает в regex, могут быть немного потрясены (мои извинения).

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Вы можете использовать следующее регулярное выражение для идентификации строк, которые удовлетворяют всем трем условиям:

^(?!.*\b(\w+)\b.+\b\1\b)(?:.*\b\w+\b){5}.*[.?!]\s*$

с установленным флагом безразличного регистра.

Демо * Движок регулярных выражений 1008 *

Python выполняет следующие операции.

^            # match beginning of line
(?!          # begin negative lookahead
  .+         # match 1+ chars
  \b(\w+)\b  # match a word in cap grp 1
  .+         # match 1+ chars
  \b\1\b     # match the contents of cap grp 1 with word breaks
)            # end negative lookahead
(?:          # begin non-cap grp
  .+         # match 1+ chars
  \b\w+\b    # match a word
)            # end non-cap grp
{5}          # execute non-cap grp 5 times
.*           # match 0+ chars
[.?!]        # match a punctuation char
\s*          # match 0+ whitespaces
$            # match end of line
0 голосов
/ 09 апреля 2020

Элементы 1. и 3. легко выполняются с помощью регулярных выражений, но

2. words in sequence must be distinct

Я не понимаю, как вы могли бы сделать это с помощью шаблона регулярных выражений. Помните, что регулярное выражение является операцией сопоставления строк; это не делает тяжелую логику c. Эта проблема не звучит для меня как проблема регулярных выражений.

Я рекомендую разбивать строку на символ " " и проверять слово за словом. Быстрее, без пота.

Редактировать

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