Как использовать RE, чтобы найти несколько совпадений сбалансированного размера в строке? - PullRequest
1 голос
/ 09 января 2020

Я превратил проблему в проблему сопоставления с образцом и попытался использовать RE для ее решения.

Преобразованная проблема: для строки «0/1», например s = '111100111111100111111001', попробуйте найти точно 3 совпадений подстроки:

a '1', за которым следует произвольное количество любых символов, а затем 2 последовательных '1's и общий размер совпадение не менее 4.

Вышеуказанное требование может быть закодировано как шаблон RE: '1.{1,}11'. И обратный образец также принят: '11.{1,}1'. Кроме того, интервал любых двух соседних совпадений должен использовать как можно меньше символов.

Все это переводится, как показано ниже:

> import re
> s = '111100111111100111111001'
> p = '.*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?'
> ret = re.match(p, s)
> ret.groups()

Результат:

> ('1111001111111', '1111', '11001')

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

Уточненный результат должен быть:

('1111001', '1111111', 11111001 ')

Но как я могу использовать RE для наложения этого ограничения?

1 Ответ

1 голос
/ 09 января 2020

Я могу думать только об этом:

var input = '111100111111100111111001';

for (var i = input.length; i >= 4; i--) {
  var matches = input.match(new RegExp('.{' + i + '}', 'g'));
  
  var output = matches.filter(x => /^1.+1$/.test(x));
  
  if (output.length === 3) {
    console.log(output)
  }
}

Начиная с 1, заканчивая 1 и имеющим не менее 4 символов

Итак, ваш пример ввода должен быть согласованным тоже. Есть много выходов, которые могут быть сопоставлены, как вы можете видеть.

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