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

Это уродливо, и я уверен, что у вас, ребята, есть для этого одна строчка. Может быть, регулярное выражение?

1
uqji 5 Июл 2019 в 09:01

5 ответов

Лучший ответ

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

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)])
3
Andrej Kesely 5 Июл 2019 в 06:08

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

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

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

демонстрация

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

1
Michał Turczyn 5 Июл 2019 в 06:11

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

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

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

3
Sweeper 5 Июл 2019 в 06:21

Вот итеративный подход к регулярному выражению с использованием простого шаблона 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
Tim Biegeleisen 5 Июл 2019 в 06:07

Однострочное решение с использованием 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']
1
sahasrara62 5 Июл 2019 в 06:16