在Python中使用if else或正则表达式将二进制数据“111”更改为“001”
我有一个文件,里面有一些二进制数据,比如:
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'