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

1 投票
2 回答
53 浏览
提问于 2025-04-12 04:34

我有一个文件,里面有一些二进制数据,比如:

0100010000101111101101001011010000101110111101111110111110111111111000000000001

我想把 11 转换成 01

举个例子,如果是 01,那就还是 01;如果是 011,那就变成 001;如果是 0111,那就变成 0001;如果是 01111,那就变成 00001

所以转换后,我的数据会变成:

0100010000100000100101001001010000100010000100000010000010000000001000000000001

我现在是用查找和替换的方法多次操作。

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。

2 个回答

2

这里有一种使用位运算符的方法:

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

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

具体步骤:

首先,我们用一个异或(XOR)运算符和左移的值进行运算。这样做的目的是为了去掉一串数字中的所有1,只留下最后一个。

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

这个方法效果不错,但现在在原始值中,1前面的每个0都会变成1。

要解决这个问题,你只需要用与(AND)运算符和原始值进行运算:

      01100110001110000110111011101110001110011000110000011000011000000001000000000011
 AND   0100010000101111101101001011010000101110111101111110111110111111111000000000001
---------------------------------------------------------------------------------------
  =    0100010000100000100101001001010000100010000100000010000010000000001000000000001

还有一种方法,就是连续进行三次替换:

  • 第一次替换保护住'10'这个组合
  • 第二次替换把所有的1都变成0
  • 第三次替换再把'10'恢复回来

f'{data}0'.replace('10', 'X').replace('1', '0').replace('X', '10')[:-1]

2

你可以简单地把一个后面跟着另一个的 1 替换成 0

import re

data = "0100010000101111101101001011010000101110111101111110111110111111111000000000001"
data = re.sub(r'1(?=1)', '0', data)
print(data)

输出结果:

'0100010000100000100101001001010000100010000100000010000010000000001000000000001'

撰写回答