2014-03-29 30 views
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

我在做什麼錯?

+0

你的代碼只修改最後一行寫文件。這是你想要的嗎?因爲在這種情況下,您可以簡單地避免迭代整個文件並只讀最後一行... – Bakuriu

+0

我的文件只包含一行。我只是忘了修改代碼 – confucij

+0

@confucij什麼是您的預期輸出? – janos

回答

0

在你的模式,集團之一,是整個模式

例如,對於

7D030C0202010302c003 c0 20 20 

結果你得到這個作爲一個匹配(=()):

( '7D030C0202010302c003', '7D', '030C', '0202010302', 'C0', '03')

如果刪除外組的模式是這樣的:

pattern = re.compile(r'(\w{2})(\w{2}0C)(0202010302)(\w{2})(03)') 

你得到這樣的:

('7D', '030C', '0202010302', 'c0', '03') 

而最終的結果:

030C0202010302c04f03 c0 20 20