将二进制字符串分解为段

时间:2019-07-05 06:01:42

标签: python regex string

此处的任务是将字符串110011110110000分解为一个列表:

['11', '00', '1111', '0', '11', '0000']

我的解决方法是

str1='110011110110000'
seg = []
a0=str1[0]
seg0=''
for a in str1:
    print('a=',a)
    if a==a0:
        seg0=seg0+a
    else:
        print('seg0=',seg0)
        seg.append(seg0)
        seg0=a
        a0=a
seg.append(seg0)
seg

这很丑陋,我相信你们那里对此有一线希望。也许正则表达式?

5 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupbydoc):

str1='110011110110000'

from itertools import groupby

l = [v * len([*g]) for v, g in groupby(str1)]

print(l)

打印:

['11', '00', '1111', '0', '11', '0000']

编辑:带有正则表达式的版本:

str1='110011110110000'
import re
print([g[0] for g in re.findall(r'((\d)\2*)', str1)])

答案 1 :(得分:3)

以下是使用简单模式1+|0+的迭代正则表达式方法:

str1 = "110011110110000"
pattern = re.compile(r'(1+|0+)')
result = []

for m in re.finditer(pattern, str1):
    result.append(m.group(0))

print(result)

此打印:

['11', '00', '1111', '0', '11', '0000']

请注意,我们可能想在这里使用re.splitre.split的问题在于它似乎不支持环视拆分。在其他语言(例如Java)中,我们可以尝试按此模式进行拆分:

(?<=0)(?=1)|(?<=1)(?=0)

这会很好地生成我们期望的数组/列表。

答案 2 :(得分:3)

这是一个正则表达式解决方案:

result = [x[0] for x in re.findall(r'(([10])\2*)', str1)]

正则表达式为(([10])\2*),找到0或1,然后继续寻找相同的东西。由于findall返回了匹配项中的所有组,因此我们需要将其映射到第一个组(组2为([10])位)。

答案 3 :(得分:1)

使用groupy

的单行解决方案
from itertools import groupby     

text='1100111101100001'    
sol = [''.join(group) for key, group in groupby(text)]

print(sol)

输出

['11', '00', '1111', '0', '11', '0000', '1']

不是正则表达式解决方案,而是对您的代码进行了改进

str1='110011110110000'

def func(string):
    tmp = string[0]
    res =[]
    for i, v in enumerate(string, 1):
        if v==tmp[-1]:
            tmp+=v
        else:
            res.append(tmp)
            tmp=v
    res.append(tmp)
    return res

print(func(str1))

输出

['111', '00', '1111', '0', '11', '0000']

答案 4 :(得分:1)

您可以使用常规正则表达式(.)\1*

(.)-匹配单个字符(任意)并将其存储在第一个捕获组中

\1*-重复第一次捕获组中的内容零次或多次

Demo

匹配集合将是您想要的结果。