ignorecase example python regex python-3.x parsing binary

example - python split regex



¿Expresión regular analizando un archivo binario? (3)

Creo que usas Python 3.

1.Abrir un archivo en modo binario es simple pero sutil. La única diferencia de abrirlo en modo texto es que el parámetro de modo contiene un carácter ''b'' .

........

4.Hay una diferencia, sin embargo: un objeto de secuencia binaria no tiene ningún atributo de codificación. Eso tiene sentido, ¿verdad? Está leyendo (o escribiendo) bytes , no cadenas, por lo que no hay ninguna conversión para Python.

http://www.diveintopython3.net/files.html#read

Luego, en Python 3, dado que una secuencia binaria de un archivo es una secuencia de bytes, una expresión regular para analizar una secuencia de un archivo debe definirse con una secuencia de bytes, no una secuencia de caracteres.

En Python 2, una cadena era una matriz de bytes cuya codificación de caracteres se rastreó por separado. Si quería Python 2 para realizar un seguimiento de la codificación de caracteres, tenía que utilizar una cadena Unicode (u '''') en su lugar. Pero en Python 3, una cadena es siempre lo que Python 2 llamó una cadena Unicode, es decir, una matriz de caracteres Unicode (posiblemente de diferentes longitudes de bytes).

http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html

y

En Python 3, todas las cadenas son secuencias de caracteres Unicode . No existe una cadena de Python codificada en UTF-8, o una cadena de Python codificada como CP-1252. "¿Es esta cadena UTF-8?" Es una pregunta inválida. UTF-8 es una forma de codificación de caracteres como una secuencia de bytes. Si desea tomar una cadena y convertirla en una secuencia de bytes en una determinada codificación de caracteres, Python 3 puede ayudarlo con eso.

http://www.diveintopython3.net/strings.html#boring-stuff

y

4.6. Cadenas vs. Bytes # Los bytes son bytes; los personajes son una abstracción Una secuencia inmutable de caracteres Unicode se llama cadena. Una secuencia inmutable de números-entre-0-y-255 se llama un objeto de bytes.

....

1. Para definir un objeto de bytes, use la sintaxis b '''' "byte literal" . Cada byte dentro del literal de byte puede ser un carácter ASCII o un número hexadecimal codificado de / x00 a / xff (0-255).

http://www.diveintopython3.net/strings.html#boring-stuff

Entonces definirás tu expresión regular de la siguiente manera

pat = re.compile(b''[a-f]+/d+'')

y no como

pat = re.compile(''[a-f]+/d+'')

Más explicaciones aquí:

http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html

Tengo un archivo que mezcla datos binarios y datos de texto. Quiero analizarlo a través de una expresión regular, pero me sale este error:

TypeError: can''t use a string pattern on a bytes-like object

Supongo que ese mensaje significa que Python no quiere analizar archivos binarios. Estoy abriendo el archivo con las banderas "rb" .

¿Cómo puedo analizar archivos binarios con expresiones regulares en Python?

EDITAR: estoy usando Python 3.2.0


En su re.compile necesita usar un objeto bytes , representado por una inicial b :

r = re.compile(b"(This)")

Esto es Python 3 siendo exigente con la diferencia entre cadenas y bytes.


Esto está funcionando para mí para Python 2.6

>>> import re >>> r = re.compile(".*(ELF).*") >>> f = open("/bin/ls") >>> x = f.readline() >>> r.match(x).groups() (''ELF'',)