validar regulares python3 online expresiones ejemplos python regex file-io text-mining string-parsing

regulares - re python



¿Cómo busco un patrón dentro de un archivo de texto usando Python combinando operaciones de expresiones regulares y cadenas/archivos y almacenando instancias del patrón? (2)

Haciéndolo en una sola lectura masiva:

import re textfile = open(filename, ''r'') filetext = textfile.read() textfile.close() matches = re.findall("(<(/d{4,5})>)?", filetext)

Linea por linea:

import re textfile = open(filename, ''r'') matches = [] reg = re.compile("(<(/d{4,5})>)?") for line in textfile: matches += reg.findall(line) textfile.close()

Pero, una vez más, las coincidencias que devuelve no serán útiles para nada, excepto contar, a menos que haya agregado un contador de compensación:

import re textfile = open(filename, ''r'') matches = [] offset = 0 reg = re.compile("(<(/d{4,5})>)?") for line in textfile: matches += [(reg.findall(line),offset)] offset += len(line) textfile.close()

Pero todavía tiene más sentido leer todo el archivo de una vez.

Así que esencialmente estoy buscando específicamente un código de 4 dígitos dentro de dos corchetes angulares dentro de un archivo de texto. Sé que necesito abrir el archivo de texto y luego analizarlo línea por línea, pero no estoy seguro de cuál es la mejor manera de estructurar mi código después de marcar "para línea en archivo".

Creo que de alguna manera puedo dividirlo, quitarlo o particionarlo, pero también escribí una expresión regular que utilicé para compilar, y si eso devuelve un objeto coincidente, no creo que pueda usar eso con esas operaciones basadas en cadenas. Además, no estoy seguro de si mi expresión regular es lo suficientemente codicioso o no ...

Me gustaría almacenar todas las instancias de esos hits encontrados como cadenas dentro de una tupla o una lista.

Aquí está mi expresión regular:

regex = re.compile("(<(/d{4,5})>)?")

No creo que deba incluir todo ese código, considerando que es bastante básico hasta ahora.


import re pattern = re.compile("<(/d{4,5})>") for i, line in enumerate(open(''test.txt'')): for match in re.finditer(pattern, line): print ''Found on line %s: %s'' % (i+1, match.groups())

Un par de notas sobre la expresión regular:

  • No necesitas el ? al final y al exterior (...) si no quiere hacer coincidir el número con los corchetes angulares, pero solo quiere el número mismo
  • Coincide con 4 o 5 dígitos entre los corchetes angulares

Actualización: es importante entender que la coincidencia y la captura en una expresión regular pueden ser bastante diferentes. La expresión regular en mi fragmento anterior coincide con el patrón con corchetes angulares, pero solicito capturar solo el número interno, sin los corchetes angulares.