2012-05-07 24 views
24

Básicamente, 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".¿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?

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

me gustaría para almacenar todas las instancias de esos golpes que se encuentran como cadenas o bien dentro de una tupla o una lista.

Aquí es mi expresión regular:

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

No creo que tenga que incluir todo lo que mucho código teniendo en cuenta su muy básicos hasta el momento.

+2

¿Su archivo es demasiado grande para mantener todo en la memoria al mismo tiempo? – Josiah

+0

¿El uso final de esto es un módulo que devuelve una lista o tupla con la que se puede comparar? Por lo tanto, no estoy seguro, pero ese es el uso final que me gustaría tener. –

+0

Bueno, está la función re.findall() que devuelve una lista de todas las coincidencias en el archivo, por lo que si lees el archivo en una cadena (.read()) puedes ejecutar eso en él y te da una lista de objetos de partido Sin embargo, si el archivo es demasiado grande para la memoria, necesitaría leerlo una línea a la vez (o como quiera que quiera dividirlo) – Josiah

Respuesta

28
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 es necesario el ? al final y el (...) exterior si no desea que coincida con el número entre paréntesis angulares, pero sólo desea que el número en sí
  • coincide con 4 o 5 cifras entre paréntesis angulares

actualización: Es importante entender que la coincide con y captura en una expresión regular puede ser bastante diferente. La expresión regular en mi fragmento anterior coincide con el patrón con paréntesis angulares, pero te pido para capturar sólo el número interno, sin los paréntesis angulares.

+0

¿qué quiere decir externo (...)? ¿Estás diciendo que puedo hacer coincidir todos los números de 4 a 5 dígitos entre los corchetes angulares? Porque eso es lo que quería hacer, excepto que estaba planeando hacer coincidir los corchetes angulares, pero luego usar rsplit y lsplit de forma iterativa. –

+0

@CarlCarlson: Compare su expresión regular con la mía. Puse capturando parens '(...)' solo alrededor del número. Hiciste alrededor del número * y * los corchetes angulares. Entonces, tu partida devolverá ambas, y solo necesitarás el primer IIUC. ** Ver también la actualización de mi respuesta ** –

+0

Creo que entiendo la coincidencia y la captura un poco mejor, pero para que quede claro, no está dando a entender que quiero usar el anclaje, ¿verdad? Porque solo quiero instancias de números entre corchetes angulares. –

9

Hacerlo en una mayor lee:

import re 

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

Línea por línea:

import re 

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

Pero, de nuevo, los partidos que devuelve no será útil para nada más que contar a menos que ha añadido un contador de desplazamiento :

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 el archivo completo a la vez.

+0

¿qué es exactamente un contador de compensación y cuál es el propósito? ¿Por qué no podría llamar a este módulo que devuelve una lista y verificar si las cadenas de la lista coinciden con otra cadena? –

+0

Oh, no entendí que en la pregunta original, si eso es lo que quieres hacer, el contador de compensación es innecesario. Supuse que querías saber en qué parte del archivo se encontraban las cadenas, me disculpo. – Josiah

Cuestiones relacionadas