2017-10-04 70 views
1

我有一個文本文件,需要我在二進制文件中讀取它,並用二進制寫出。沒問題。我需要屏蔽掉有兩個X身分證號碼,很容易正常:Python正則表達式二進制文件文本文件 - 如何使用一系列數字和單詞邊界?

text = re.sub("\\b\d{3}-\d{2}-\{4}\\b","XXX-XX-XXXX", text)

這是我解析文本的樣本:

more stuff here CHILDREN�S 001-02-0003 get rid of that stuff goes here not001-02-0003 but ssn:001-02-0003

,我需要打開它轉換成:

more stuff here CHILDREN�S XXX-XX-XXXX get rid of that stuff goes here not001-02-0003 but ssn:XXX-XX-XXXX

超!所以現在我試圖用二進制編寫相同的正則表達式。這裏是我有什麼,它的「作品」,但它天哪,感覺不對都:

line = re.sub(b"\\B(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\x00-(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\x00-(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\\B", b"\x00X\x00X\x00X\x00-\x00X\x00X\x00-\x00X\x00X\x00X\x00X", line)

注:

  • 的垃圾對於兒童,我要堅持這樣說,這
  • 需要字邊界,因此4號線不會被屏蔽掉

不該我正則表達式是數字,而不是一個範圍?我只是不知道如何在二進制中做到這一點。而我的詞語界限只能用作爲\ B而不是\ b,呃..這是怎麼回事?

更新:我也試過這樣:

line = re.sub(b"[\x30-\x39]", b"\x58", line)

,並且它會爲每一個數字,但是如果我嘗試連做喜歡的事,很簡單:

line = re.sub(b"[\x30-\x39][\x30-\x39]", b"\x58\x58", line)

它不匹配任何東西,爲什麼?

回答

0

您可以試試:

import re 

rx = re.compile(r'\b\d{3}-\d{2}-\d{4}\b') 

with open("test.txt", "rb") as fr, open("test2.txt", "wb+") as fp: 
    repl = rx.sub('XXX-XX-XXXX', fr.read()) 
    fp.write(repl) 

這每一個垃圾字符保留,因爲它們並將它們寫入test2.txt
請注意,如果您不希望每個反斜槓都被轉義,則可以在Python中使用r'string here'

+0

有一堆'破'字型字符,所以我需要把它作爲二進制文件來處理。有些是UTF-8,但人們纏繞繞線,以及不符合業務要求(殺我)的東西,我需要保留破壞的角色並簡單地去掉SSN。如果我採用UTF-8編碼,我開始得到各種編碼錯誤。 – sniperd

+0

具體與我得到的垃圾文件:UnicodeDecodeError:'utf-8'編解碼器無法解碼位置0中的字節0xff:無效起始字節 – sniperd

+0

@sniperd:更新,這是否適合您?我在'test2.txt'這裏得到相同的垃圾字符。 – Jan

相關問題