2017-09-13 67 views
2

我打算做什麼?Python 3.6.1 |正則表達式在帶有特殊字符的文件上搜索

要執行在Windows文件系統中的文件組當中的字母字符串列表的搜索(約25K號不同大小和擴展主要是純文本文件,最大的文件是不是比大小几MB以上)

我做了什麼來達到這個目的?

for each_file in files: 
    file_read_handle = open(each_file,"rb") 
    file_read_handle.seek(0) #ensure you're at the start of the file 
    first_char = file_read_handle.read(1) #get the first character 
    if first_char: 
     file_read_content_mappd = mmap.mmap(file_read_handle.fileno(), 0, access=mmap.ACCESS_READ) 
     if re.search(br'(?i)T_0008X_WEB', file_read_content_mappd): 
      file_write_content = ('Text T_0008X_WEB found in {}'.format(each_file)) 
      file_write_handle.write(file_write_content)  
      file_write_handle.write("\n") 
file_write_handle.close() 

文件中這段代碼作品就好硬編碼文本搜索(見線T_0008X_WEB),它們以二進制方式打開( 「RB」)避免的UnicodeDecodeError :'charmap'編解碼器無法解碼位置776中的字節0x9d:字符映射到未定義的錯誤。

但是,試圖通過與像這個 - if re.search('br\'(?i)' + regex_search_str_byte + '\'', file_read_content_mappd):的變量替換硬編碼值來搜索值的列表中,一直面臨着以下issues-

  1. 當使用時:re.search('br\'(?i)' + regex_search_str + '\'', file_read_content_mappd):遇到錯誤: 文件是二進制的,搜索文本是字符串類型
  2. 使用時:re.search(regex_search_str_byte, file_read_content_mappd):得到問題:找不到匹配,因爲即使是正則表達式字符BR'(我)也被認爲是字節轉換搜索文本

請求指導如何爲值列表進行字節轉換文本正則表達式搜索,在打開二進制模式的一部分文件讀取?

+0

看起來像你需要'如果re.search(str.encode(regex_search_str),file_read_content_mappd)' –

+0

@WiktorStribiżew:在這種情況下,我們應該如何包含正則表達式** br'(?i)**?試圖在第2種情況下做同樣的事情,例如試圖將包括正則表達式flags_的_entire值保存到變量_regex_search_str_中,並將該字符串轉換爲字節並保存在_regex_search_str_byte_中。我認爲你建議字符串編碼與UTF-8選項相同,但是在這種情況下,它不返回匹配,我想字節轉換的搜索文本也認爲正則表達式標誌是搜索文本的一部分。具體的建議會更有幫助。 – Lakshman

+1

'如果re.search(str.encode(regex_search_str),file_read_content_mappd,flags = re.I)'。該標誌可以作爲參數傳遞給're.search'方法。'br'不是必需的,因爲它們用於修改字符串文字,並且您正在使用變量。我假設'regex_search_str'是一個UTF8字符串。看到[這個問題](https://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3)。 –

回答

1

使用

re.search(regex_search_str_byte, file_read_content_mappd, flags=re.I) 

re.I標誌可以作爲參數傳遞給re.search方法傳遞。 br前綴不是必需的,因爲它們用於修改字符串文字,並且您正在使用變量。