Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用RE查找字符串中的多个平衡大小匹配项?_Python_Regex - Fatal编程技术网

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

Python 如何使用RE查找字符串中的多个平衡大小匹配项?,python,regex,Python,Regex,我已将一个问题转化为模式匹配问题,并尝试使用RE来解决它 转换后的问题:给定一个“0/1”字符串,如s='111100111111100111001',尝试查找子字符串的3个匹配项: 一个'1',后跟任意数量的任意字符,然后是两个连续字符 '1的,并且匹配的总大小至少为4 上述要求可以编码为重新模式:'1.{1,}11'。也接受相反的模式:'11.{1,}1'。此外,任何2个相邻匹配的间隔应消耗尽可能少的字符 这一切翻译如下代码: > import re > s = '1111001

我已将一个问题转化为模式匹配问题,并尝试使用RE来解决它

转换后的问题:给定一个“0/1”字符串,如
s='111100111111100111001'
,尝试查找子字符串的3个匹配项:

一个
'1'
,后跟任意数量的任意字符,然后是两个连续字符
'1的
,并且匹配的总大小至少为4

上述要求可以编码为重新模式:
'1.{1,}11'
。也接受相反的模式:
'11.{1,}1'
。此外,任何2个相邻匹配的间隔应消耗尽可能少的字符

这一切翻译如下代码:

> 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来施加这个约束呢

我只能想到这一点:

var输入='111100111111111001';
对于(var i=input.length;i>=4;i--){
var matches=input.match(新的RegExp('.{'+i+'}',g');
var输出=matches.filter(x=>/^1.+1$/.test(x));
如果(output.length==3){
console.log(输出)
}

}
谢谢您的回答。我稍微更改了一下要求,从
至少3个匹配项
更改为
正好3个匹配项
。我还尝试了一些类似于您的迭代搜索解决方案,只是为了发现它没有那么有效,所以我问了这个问题,但结果可能是某种迭代搜索解决方案是必须的。@larmbr我已经更新了我的答案,将条件改为
output.length==3
。我不确定它是否解决了您的问题,但您可以从它开始。您的需求不明确,因为无法获得所需的输出。每场比赛的长度应尽可能保持平衡。顺便说一句,这不是一个“regex友好”的要求。看起来regex在这里帮不上忙。@WiktorStribiżew,是的,你可能对“平衡大小不是一个“regex友好”的要求”。事实上,我已经尝试了一个类似于答案的解决方案,但效率较低,因此我提出这个问题是为了找到一个更惯用的重新解决方案。但似乎这一要求可能超出了RE的能力。比赛的长度是通过量词和回溯机制预先确定的,无法调整。提取所有可能的匹配项,并使用语言手段找到“合适”的匹配项。