Есть ли способ использовать периодичность в регулярном выражении? - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь найти регулярное выражение для оператора Tokenizer в Rapidminer.

Теперь я пытаюсь разделить текст на части, скажем, двух слов.
Например, That was a good movie. должно привести к That was, was a, a good, good movie.

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

Таким образом, первая мысль состоит в том, чтобы использовать \s для разбиения на пробелы, но это приведет к тому, что каждое слово будет получено отдельно.

Итак, мой вопрос: как заставить выражение как-то пропустить один из двух пробелов?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Здесь - пример решения, (?=(\b[A-Za-z]+\s[A-Za-z]+)), вдохновленный этим вопросом SO .
Мой вопрос звучит неправильно, когда вы понимаете, что это проблема перекрывающегося шаблона регулярных выражений.

0 голосов
/ 03 ноября 2019

Что вы можете сделать, это использовать группу нулевой ширины (например, положительный прогноз, как показано в примере). Регулярное выражение обычно «потребляет» проверяемые им символы, но с положительным прогнозом / утверждением назад вы утверждаете, что символы существуют, не препятствуя дальнейшим проверкам проверять и эти буквы.

Это должно работать для ваших целей:

(\w+)(?=(\W+\w+))

Следующий шаблон соответствует для каждой пары из двух слов (обратите внимание, что он не будет соответствовать последнему слову, так как у него нет пары). Первое слово в первой группе захвата, (\w+). Затем положительный прогноз включает в себя совпадение для последовательности несловесных символов \W+, а затем еще одну строку символов слова \w+. Оглядываясь назад (?=...), второе слово не «употребляется».

Здесь приведена ссылка на демонстрацию по Regex101

Обратите внимание, что для каждого соответствия каждое словов своей собственной группе захвата (группа 1, группа 2)

...