Python 将二进制文件拆分为0和1的组,并获取边界索引

Python 将二进制文件拆分为0和1的组,并获取边界索引,python,regex,split,binary,itertools,Python,Regex,Split,Binary,Itertools,我有一个二进制数,我需要把它分成0和1两组。 我还需要得到每个新组建的团队的开始和结束索引 例如,假设数字为1100111100 我需要将其分组为11,001111,00 现在,每组的开始和结束索引应该如下 11:(1,2)、00:(3,4)、1111:(5,8)和00:(9,10) 我计划使用Python。我研究并发现itertools可以提供帮助,但不确定在itertools中使用哪个函数 非常感谢您的帮助 谢谢请尝试以下方法: import re str = '1100111100' l

我有一个二进制数,我需要把它分成0和1两组。 我还需要得到每个新组建的团队的开始和结束索引

例如,假设数字为
1100111100

我需要将其分组为
11,001111,00

现在,每组的开始和结束索引应该如下

11:(1,2)、00:(3,4)、1111:(5,8)和00:(9,10)

我计划使用Python。我研究并发现itertools可以提供帮助,但不确定在itertools中使用哪个函数

非常感谢您的帮助


谢谢

请尝试以下方法:

import re

str = '1100111100'
l = re.findall('0+|1+', str)    # now l = ['11', '00', '1111', '00']
l2 = []
pos = 1
for x in l:
    l2.append("%s : (%d,%d)" % (x, pos, pos + len(x) - 1))
    pos += len(x)

print(l2)
输出:

['11 : (1,2)', '00 : (3,4)', '1111 : (5,8)', '00 : (9,10)']

这可以用这样的正则表达式在一行中完成

a = "1100111100"
[' : '.join([i.group(),str((i.start()+1,i.end()))]) for i in re.finditer("0+|1+",a)]
芬迪特酒店

返回一个迭代器,为字符串中的RE模式在所有非重叠匹配上生成匹配对象

这意味着在迭代器中返回所有唯一的命中

输出

['11 : (1, 2)', '00 : (3, 4)', '1111 : (5, 8)', '00 : (9, 10)']

使用itertools.groupby:

from itertools import groupby

def func(string):
    i = 1
    for _, g in groupby(string):
        g = ''.join(g)
        j = len(g)
        yield (i, i+j-1), g
        i += j

>>> dict(func('1100111100'))
{(1, 2): '11', (3, 4): '00', (5, 8): '1111', (9, 10): '00'}

要将其用作dict,键必须是结束和开始索引,值是子字符串。

如果您不关心效率,那么最简单的策略是转换为字符串,并跟踪更改“1”->“0”一个快速而肮脏的解决方案:b=二进制字符串b_split=b.replace('10','10')。replace('01','01')。split()