0
我試圖用代碼來代替某些片段文件:Python的應用re.sub不替代
#!/usr/bin/python
import re
import binascii
def replace(match):
nw = hex(int(match.group(2),16)+int('43',16))[-2:]
nl = match.group(2)+match.group(3)+match.group(4)+nw+match.group(6)
print(match.group(1),nl,nw,len(match.group(1)),len(nl))
return nl
def main():
pattern = re.compile(r'(?=((\w{2})(\w{2}0C)(0202010302)(\w{2})(03)))')
f = open('txt_dump')
for line in f:
# for match in re.finditer(pattern, line):
# print(match.group(1),match.group(2),match.group(3),match.group(4),match.group(5),match.group(6), hex(int(match.group(2),16)+int('43',16)))
# nw = hex(int(match.group(3),16)+int('43',16))[-2:]
a = pattern.subn(repl=replace, string=line)
print(a[1])
with open("out", "wb") as of:
of.write(binascii.unhexlify(a[0]))
with open("out_txt", "w") as of:
of.write(a[0])
if __name__ == '__main__':
main()
結果我得到這樣的輸出:
7D030C02020103020003 7D030C0202010302c003 c0 20 20
00030C02020103020003 00030C02020103024303 43 20 20
A7030C02020103020303 A7030C0202010302ea03 ea 20 20
03030C02020103020303 03030C02020103024603 46 20 20
22030C02020103020303 22030C02020103026503 65 20 20
03030C02020103020303 03030C02020103024603 46 20 20
5A030C02020103020003 5A030C02020103029d03 9d 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020303 00030C02020103024303 43 20 20
03030C02020103020303 03030C02020103024603 46 20 20
4F030C02020103020203 4F030C02020103029203 92 20 20
D5030C02020103020003 D5030C02020103021803 18 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020103 00030C02020103024303 43 20 20
01030C02020103020503 01030C02020103024403 44 20 20
0D030C02020103020003 0D030C02020103025003 50 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020103 00030C02020103024303 43 20 20
01030C02020103020203 01030C02020103024403 44 20 20
02030C02020103020203 02030C02020103024503 45 20 20
CB030C02020103020003 CB030C02020103020e03 0e 20 20
00030C02020103020003 00030C02020103024303 43 20 20
00030C02020103020603 00030C02020103024303 43 20 20
06030C02020103020203 06030C02020103024903 49 20 20
02030C02020103020103 02030C02020103024503 45 20 20
89030C02020103020003 89030C0202010302cc03 cc 20 20
00030C02020103020003 00030C02020103024303 43 20 20
62030C02020103020003 62030C0202010302a503 a5 20 20
32
所以我確保它找到了正確的所有碎片。但是在結果文件中,它不會替換匹配項,它會將新值放在舊值附近。例如7D030C0202010302c0037D030C02020103020003
而不是7D030C0202010302c003
。
我在做什麼錯?
你的代碼只修改最後一行寫文件。這是你想要的嗎?因爲在這種情況下,您可以簡單地避免迭代整個文件並只讀最後一行... – Bakuriu
我的文件只包含一行。我只是忘了修改代碼 – confucij
@confucij什麼是您的預期輸出? – janos