如何使用RE在字符串中查找多个平衡大小的匹配?

问题描述 投票:1回答:1

我已经将问题转换为模式匹配问题,并尝试使用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施加此约束?

python regex
1个回答
1
投票

我只能想到这一点:

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
^^^^^^^
© www.soinside.com 2019 - 2024. All rights reserved.