Python 为什么这个正则表达式与第二个二进制间隙不匹配?

Python 为什么这个正则表达式与第二个二进制间隙不匹配?,python,regex,Python,Regex,为了解决python中列出的问题,我想我应该尝试一个很好的小正则表达式来捕获最大的“二进制间隙”(数字二进制表示中的零链) 我为这个问题编写的函数如下: def solution(N): max_gap = 0 binary_N = format(N, 'b') list = re.findall(r'1(0+)1', binary_N) for element in list: if len(element) > max_gap:

为了解决python中列出的问题,我想我应该尝试一个很好的小正则表达式来捕获最大的“二进制间隙”(数字二进制表示中的零链)

我为这个问题编写的函数如下:

def solution(N):
    max_gap = 0
    binary_N = format(N, 'b')
    list = re.findall(r'1(0+)1', binary_N)

    for element in list:
        if len(element) > max_gap:
            max_gap = len(element)

    return max_gap

它工作得很好。然而。。。由于某些原因,它与
10000100000000000001
中的第二组零不匹配(二进制表示
66561
)。9个零没有出现在匹配列表中,所以它一定是正则表达式的问题-但是我看不到它在哪里,因为它匹配其他所有给定的示例

两个匹配中不能包含相同的位。您的正则表达式匹配一个
1
,后跟一个或多个
0
s,并以另一个
1
结尾。一旦找到第一个匹配项,您将得到
000000000 1
,它不是以
1
开头的,因此与您的正则表达式不匹配


正如@JoachimIsaksson所提到的,如果您想匹配两组0,您可以使用a,以便选中最后的
1
,但不包括在匹配中<代码>r'1(0+(=1)

+1。作为奖励,您可以在正则表达式中使用前瞻,使其不匹配(并消除)后面的一个
r'1(0+(=1)
谢谢@JoachimIsaksson,我已经在中添加了它。我想您只需要
list=re.findall(r'1(0+),binary\u N)
。无需使用右侧
1
。根据有关复杂度的说明,您的算法是否满足要求(预计最坏情况时间复杂度为O(log(N))?我曾考虑过使用正则表达式,但后来保持简单,不使用任何模块。第一个问题:使用正则表达式会增加或减少任何点吗?还是取决于考官?第二个问题:我想出了这个解决方案:它是好是坏?如果我必须猜测的话,我会说复杂性是O(N)(因为我必须遍历所有位),但我猜不出O(log(N))会是什么样子。任何帮助都将是惊人的。谢谢经过测试,它确实满足了要求,尽管我承认使用regex会稍微扭曲规则。。。您是否在Codibility网站上尝试过您的解决方案?