python问题中的字符串切片

时间:2018-10-19 16:49:13

标签: python string binary slice decode

我正在编写一个简单的程序来解码以下给出的二进制字符串:

bin_str = "101100001101100001"

首先,如果第一个字符由“ 1”表示,则接下来的八个字符将被解码为“ 01100001”,在此我将“ 01100001”传递给函数以获取其ascii表示形式。

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

将“ 01100001”传递给上述函数将产生“ a”,这是解码的第一个字符。继续,索引9处的下一个字符也由“ 1”表示,因此接下来的八个字符也将被解码为“ 01100001”。传递到上面也会产生“ a”。

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

我面临的问题是从原始bin_str中切出长度为8的特定字符串“ 01100001”,在此我尝试以[i + 1:fixed_length + 1]进行切片,但是在第二阶段,fl_bin变成了“”而不是下一个“ 01100001”。

希望对此有所帮助。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种好方法是创建一个正则表达式,该表达式与1匹配,后跟正好八个10个字符,然后使用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个01的分隔s),以便阅读。

答案 1 :(得分:0)

如果iter产生next,则使用next1进行循环,然后创建接下来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']