Разрезание строк в выпуске Python - PullRequest
0 голосов
/ 19 октября 2018

Я пишу простую программу для декодирования двоичной строки, заданной следующим образом:

bin_str = "101100001101100001"

В начале, если первый символ представлен «1», то декодируются следующие восемь символов, которыебыло бы "01100001", где я передаю "01100001" в функцию, чтобы получить ее представление ascii.

def convert_ascii(binary):
    c = chr(int(binary, 2))
    return c

Передача "01100001" в вышеупомянутую функцию даст "a", который является первым декодированным символом.Далее, следующий символ с индексом 9 также представлен как «1», следовательно, следующие восемь символов также будут декодированы, что означает «01100001».Переход к вышесказанному также даст «а».

lst = []
fixed_length = 8
i = 0
while i < len(bin_str):
    if binary[i] == "1":
        fl_bin = binary[i+1:fixed_length+1] #issue here
        ascii_rep = convert_ascii(fl_bin)
        lst.append(ascii_rep)
        i+=fixed_length+1

Проблема, с которой я сталкиваюсь, заключается в том, чтобы нарезать конкретную строку длины 8, которая является "01100001", из исходного bin_str, где я попытался нарезать по [i + 1: fixed_length + 1], но наНа втором этапе fl_bin стал "" вместо следующего "01100001".

Буду признателен за помощь.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Используя iter и next для циклического перехода, если next создает 1, затем создайте подсписок из следующих 8 элементов, добавьте его в основной список и повторяйте, пока генератор не будет исчерпан.

bin_str = "101100001101100001" 
a = iter(bin_str) 
lst = []

while True:
    try:
        b = next(a)
        z = []
        if b == '1':
            for i in range(8):
                z.append(next(a))
            lst.append(''.join(z))
    except StopIteration:
        break

print(lst)
# ['01100001', '01100001']
0 голосов
/ 19 октября 2018

Хороший способ сделать это - создать регулярное выражение, которое соответствует 1, за которым следуют ровно восемь 1 или 0 символов, а затем использовать re.findall(), чтобы найти все непересекающиеся вхождения этого шаблона встрока.Используя группу без захвата, вы даже можете не допустить, чтобы начальная цифра 1 была включена в результаты (хотя, если вы этого не сделали, вырезать эту цифру тривиально).

import re
reg_ex = "(?:1)([01]{8})"

bin_str = "101100001101100001"
ascii_rep = "".join(chr(int(byte, 2)) for byte in re.findall(reg_ex, bin_str))

В качестве бонуса это позволяет разделить группы в исходной строке (пробелами, словами или чем-либо, кроме 1, за которым следуют 8 0 с или 1 с) для облегчения чтения.

...