Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式搜索十六进制字节_Python_Regex_Binary_Seek - Fatal编程技术网

Python正则表达式搜索十六进制字节

Python正则表达式搜索十六进制字节,python,regex,binary,seek,Python,Regex,Binary,Seek,我试图在一个二进制文件中搜索一系列十六进制值,但是,我遇到了一些我不能完全解决的问题。(1) 我不知道如何搜索整个文件并返回所有匹配项。目前,我有f.seek,但我认为它的值可能是最大的,这是不好的。(2) 我想返回可能匹配的十进制或十六进制偏移量,尽管每次都得到0,所以我不确定我做错了什么 示例.bin AA BB CC DD EE FF AB AC AD AE AF BA BB BC BD BE BF CA CB CC CD CE CF DA DB DC DD DE DF EA EB EC

我试图在一个二进制文件中搜索一系列十六进制值,但是,我遇到了一些我不能完全解决的问题。(1) 我不知道如何搜索整个文件并返回所有匹配项。目前,我有f.seek,但我认为它的值可能是最大的,这是不好的。(2) 我想返回可能匹配的十进制或十六进制偏移量,尽管每次都得到0,所以我不确定我做错了什么

示例.bin

AA BB CC DD EE FF AB AC AD AE AF BA BB BC BD BE
BF CA CB CC CD CE CF DA DB DC DD DE DF EA EB EC
代码:

# coding: utf-8
import struct
import re

with open("example.bin", "rb") as f:
    f.seek(30)
    num, = struct.unpack(">H", f.read(2))
hexaPattern = re.compile(r'(0xebec)?')
m = re.search(hexaPattern, hex(num))
if m:
   print "found a match:", m.group(1)
   print " match offset:", m.start()
也许有更好的方法来做这一切?

试试看

import re

with open("example.bin", "rb") as f:
    f1 = re.search(b'\xEB\xEC', f.read())

print "found a match:", f1 .group()
print " match offset:", f1 .start()
  • 我不知道如何搜索整个文件并返回所有匹配项
  • 我想返回十进制或十六进制的偏移量
  • 文件中的位置像列表一样使用基于0的索引

    e.finditer(模式、字符串、标志=0)
    返回一个迭代器,在所有 字符串中RE模式的非重叠匹配。字符串是 从左到右扫描,并按找到的顺序返回匹配项

    匹配对象支持以下方法和属性:
    开始([组])
    结束([组])
    返回索引的开始和结束 分组匹配的子串;组默认为零(表示 全匹配子串)


    文件有多大?文件大小可以从100KB到10MB。谢谢,这几乎是完美的。有没有办法使f1.group()显示为十六进制?很好,效果很好。谢谢你的解释,非常有帮助@DIF,如果不希望偏移十六进制字符串前面有“0x”,可以使用format():
    打印“{:02X}”。format(offset)
    (还为所有十六进制代码创建两位数字)。
    import re
    
    f = open('data.txt', 'wb')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.write('\xAA\xBB\xEB\xEC')
    f.close()
    
    f = open('data.txt', 'rb')
    data = f.read()
    f.close()
    
    pattern = "\xEB\xEC"
    regex = re.compile(pattern)
    
    for match_obj in regex.finditer(data):
        offset = match_obj.start()
        print "decimal: {}".format(offset)
        print "hex(): " + hex(offset)
        print 'formatted hex: {:02X} \n'.format(offset)
    
    --output:--
    decimal: 2
    hex(): 0x2
    formatted hex: 02 
    
    decimal: 6
    hex(): 0x6
    formatted hex: 06 
    
    decimal: 10
    hex(): 0xa
    formatted hex: 0A 
    
    decimal: 14
    hex(): 0xe
    formatted hex: 0E 
    
    decimal: 18
    hex(): 0x12
    formatted hex: 12 
    
    decimal: 22
    hex(): 0x16
    formatted hex: 16 
    
    decimal: 26
    hex(): 0x1a
    formatted hex: 1A