Python 3.6.1 |正则表达式搜索具有特殊字符的文件

Python 3.6.1 |正则表达式搜索具有特殊字符的文件,python,regex,search,mmap,Python,Regex,Search,Mmap,我打算做什么? 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_c

我打算做什么?

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()
在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\u search\u str\u byte+''''''',file\u read\u content\u mappd):
,遇到了以下问题-

  • 使用时:
    re.search('br\'(?i)+regex\u search\u str+'\'',file\u read\u content\u mappd):
    get错误:文件为二进制,搜索文本为字符串类型
  • 使用时:
    re.search(regex\u search\u str\u byte,file\u read\u content\u mappd):
    出现问题:找不到匹配项,因为甚至regex字符br'(?i)也被视为字节转换搜索文本的一部分
  • 有关如何在二进制模式打开文件读取时执行字节转换文本正则表达式搜索值列表的指导请求?

    使用

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

    re.I
    标志可以作为参数传递给
    re.search
    方法
    br
    前缀是不必要的,因为它们用于修改字符串文字,而您使用的是变量。

    如果重新搜索(str.encode(regex_search_str),file_read_content_mappd),那么您需要
    @WiktorStribiżew:在这种情况下,我们应该如何包含regex标志br'(?i)?在问题中提到的案例2中也尝试了同样的方法,比如,尝试将包含regex标志的整个值保存到变量regex_search_str中,并将该字符串转换为byte并保存在regex_search_str_byte中。我认为您也建议使用字符串编码到UTF-8选项,但是,在本例中,它没有返回匹配项,并且我假设字节转换的搜索文本也将regex标志视为搜索文本的一部分。针对这一点的建议会更有帮助。
    如果重新搜索(str.encode(regex\u search\u str),文件读取内容映射,flags=re.I)
    。该标志可以作为参数传递给
    re.search
    方法
    br
    不是必需的,因为它们用于修改字符串文字,并且您使用的是变量。我假设
    regex\u search\u str
    是一个UTF8字符串。请参阅。如何创建/分配
    regex\u search\u str\u byte
    regex\u search\u str\u byte=bytes(每个字符串“utf-8”)
    。每个字符串都是另一个python字母数字字符列表的元素