Búsqueda de expresiones regulares en Python para bytes hexadecimales

Estoy tratando de buscar en un archivo binario una serie de valores hexadecimales, sin embargo, me he encontrado con algunos problemas que no puedo resolver. (1) No estoy seguro de cómo buscar todo el archivo y devolver todas las coincidencias. En la actualidad, tengo f.seek yendo tan lejos como creo que podría ser el valor, lo cual no es bueno. (2) Me gustaría devolver el desplazamiento en decimal o hexadecimal donde pueda haber una coincidencia, aunque obtengo 0 cada vez, así que no estoy seguro de qué hice mal.

example.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 

código:

 # 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() 

Tal vez hay una mejor manera de hacer todo esto?

  1. No estoy seguro de cómo buscar todo el archivo y devolver todas las coincidencias.
  2. Me gustaría devolver la compensación en decimal o hexadecimal
 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 

Las posiciones en el archivo utilizan la indexación basada en 0 como una lista.

e.finditer (patrón, cadena, banderas = 0)
Devuelva un iterador que genere instancias de MatchObject sobre todas las coincidencias no superpuestas para el patrón RE en la cadena. La cadena se escanea de izquierda a derecha y las coincidencias se devuelven en el orden encontrado.

Los objetos coincidentes admiten los siguientes métodos y atributos:
inicio ([grupo])
final ([grupo])
Devuelve los índices de inicio y final de la subcadena combinada por grupo; los valores predeterminados del grupo son cero (es decir, toda la subcadena coincidente).

https://docs.python.org/2/library/re.html

tratar

 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()