Разбить двоичную строку на сегменты - PullRequest
1 голос
/ 05 июля 2019

Задача здесь состоит в том, чтобы разбить строку 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 ]

3 голосов
/ 05 июля 2019

Вот решение для регулярных выражений:

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

Регулярное выражение - (([10])\2*), найдите 0 или 1, затем продолжайте искать ту же самую вещь.Так как findall возвращает все группы в сопоставлении, нам необходимо сопоставить его с первой группой (группа 2 - это бит ([10])).

3 голосов
/ 05 июля 2019

Вот итеративный подход к регулярному выражению, использующий простой шаблон 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.splitВот.Проблема с re.split заключается в том, что он не поддерживает разбиение на обходные пути.В других языках, таких как Java, мы могли бы попытаться разделить этот шаблон:

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

Это бы сгенерировало ожидаемый массив / список.

3 голосов
/ 05 июля 2019

Вы можете использовать itertools.groupby ( документ ):

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 голос
/ 05 июля 2019

Вы можете использовать общее регулярное выражение (.)\1*

(.) - сопоставить один символ (любой) и сохранить его в первой группе захвата

\1* - повторить то, что было [получено впервая группа захвата ноль или более раз

Демо

Сбор совпадений будет вашим желаемым результатом.

1 голос
/ 05 июля 2019

однолинейное решение с использованием 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']

не решение регулярных выражений, а улучшение кода ur

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...