使用 if else 或使用正则表达式在 python 中更改二进制数据,如“111 变为 001”

问题描述 投票:0回答:1

我有一些可用的二进制数据的文件,例如“0100010000101111101101001011010000101110111101111110111110111111111000000000001”,我想将11转换为01,例如如果它是01,则将是01 , 如果 011 则为 001, 如果 0111 则为 0001, 01111将是00001,所以转换后我的上述数据将是“0100010000100000100101001001010000100010000100000010000010000000001000000000001”我多次使用查找和替换方法,有人可以指导我如何使用正则表达式在一个代码中做到这一点或者if else语句,我刚刚开始学习python,

fin = open("1.txt", "rt")
data = fin.read()

data = data.replace('011', '001')


fin.close()
fin = open("2.txt", "wt")
fin.write(data)
fin.close()

os.remove('1.txt')



fin = open("2.txt", "rt")
data = fin.read()

data = data.replace('011', '001')


fin.close()
fin = open("1.txt", "wt")
fin.write(data)
fin.close()

os.remove('2.txt')

有人可以指导我如何使用正则表达式或 if else 语句在一个代码中做到这一点,

python regex if-statement binary
1个回答
0
投票

使用按位运算符实现此目的的方法:

dataFormat = f'0{len(data)}b'
value = int(data, 2)

result = f'{value ^ (value << 1) & value:{dataFormat}}'

详情:

首先,我们对左移值应用异或运算符。目标是删除序列中除最后一个之外的所有 1。

       0100010000101111101101001011010000101110111101111110111110111111111000000000001  
 XOR  01000100001011111011010010110100001011101111011111101111101111111110000000000010
--------------------------------------------------------------------------------------- 
  =   01100110001110000110111011101110001110011000110000011000011000000001000000000011 

效果很好,但现在 1 序列(原始值)左边的每个 0 都变成了 1。

要解决这个问题,您只需与原始值应用 AND 运算符即可:

      01100110001110000110111011101110001110011000110000011000011000000001000000000011
 AND   0100010000101111101101001011010000101110111101111110111110111111111000000000001
---------------------------------------------------------------------------------------
  =    0100010000100000100101001001010000100010000100000010000010000000001000000000001
© www.soinside.com 2019 - 2024. All rights reserved.