obtener la ruta en un archivo dentro de {} por python

Tengo un código y solo quiero tener / X / Y / Z / C, / X / Y / Z / D, / X / Y / Z / E de vuelta (lo que venga después de -tree). En realidad debería leer el archivo, ignora todo hasta que ve WFS y luego obtiene la información en {}, encuentra el árbol y me devuelve las rutas.

Soy un principiante en Python. El patrón de coincidencia no funciona porque creo que el camino cambia todos los días. Cualquier ayuda será apreciada.

El código:

DEFAULTS { FS { -A AAA -B } -aaaaaa C { } } D "FW0" { } WFS "C:" XXXX:"/C" { -trees "/X/Y/Z/C" "/X/Y/Z/D" "/X/Y/Z/E" -A AAA } 

Un analizador léxico basado en una máquina de estado haría el truco de manera confiable.

Reconoce las construcciones del archivo que nos interesan: llaves anidadas, secciones con nombre (un identificador y una llave de apertura en la siguiente línea; esta solo se preocupa por las secciones de nivel superior) y cláusulas (iniciadas por -identifier dentro de una sección de nivel superior , posiblemente seguido por líneas de datos y terminado por otra cláusula o por el final de la sección).

Luego sigue leyendo el archivo e imprime las líneas de datos encontradas si están en la sección y la cláusula en las que estamos interesados. También establece una marca al encontrarlas para salir inmediatamente después de que finalice esa cláusula.

 f = open("t.txt") import re identifier=None brace_level=0 section=None clause=None req_clause_found=False def in_req_clause(): return section=='WFS' and clause=='trees' for l in (l.strip() for l in f): if req_clause_found and not in_req_clause(): break m=re.match(r'[AZ]+',l) #adjust if section names can be different if m and section is None: identifier=m.group(0) continue m=re.match(r'\{(\s|$)',l) if m: brace_level+=1 if identifier is not None and brace_level==1: section=identifier identifier=None continue else: identifier=None m=re.match(r'\}(\s|$)',l) if m: brace_level-=1 if brace_level==0: section=None clause=None continue m=re.match(r'-([A-Za-z]+)',l) #adjust if clause names can be different if m and brace_level==1: clause=m.group(1) continue m=re.match(r'"(.*)"$',l) if m and in_req_clause(): print m.group(1) req_clause_found=True continue 

En la muestra, esto da como resultado

 /X/Y/Z/C /X/Y/Z/D /X/Y/Z/E 

Estoy un poco confundido por el diseño de su archivo, pero ¿hay alguna razón para no analizarlo línea por línea?

 def parse(): with open('data.txt') as fptr: for line in fptr: if line.startswith('WFS'): for line in fptr: if line.strip().startswith('-trees'): result = [] for line in fptr: if line.strip().startswith('"'): result.append(line.strip()) else: return result 

Eso no es bonito pero creo que funcionará! Vamos a intentarlo:

 In [1]: !cat temp.txt DEFAULTS { FS { -A AAA -B } -aaaaaa C { } } D "FW0" { } WFS "C:" XXXX:"/C" { -trees "/X/Y/Z/C" "/X/Y/Z/D" "/X/Y/Z/E" -A AAA } In [2]: %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :def parse(): : with open('temp.txt') as fptr: : for line in fptr: : if line.startswith('WFS'): : for line in fptr: : if line.strip().startswith('-trees'): : result = [] : for line in fptr: : if line.strip().startswith('"'): : result.append(line.strip()) : else: : return result : :-- In [3]: parse() Out[3]: ['"/X/Y/Z/C"', '"/X/Y/Z/D"', '"/X/Y/Z/E"'] 

No estoy seguro de cuáles son las variaciones exactas de sus patrones, pero podría usar grupos de expresiones regulares:

 import re myjunk = open("t.txt", "r") for line in myjunk: if re.match('(/[AZ])*', line) print line, 

Es posible que deba jugar un poco con la expresión regular, pero el punto importante aquí es invertir un poco de tiempo en el aprendizaje de expresiones regulares, y no tendrá que lidiar con algunas de las soluciones innecesariamente complicadas que se sugieren en otros lugares. Regex es un propósito de mini lenguaje creado para tantas cosas relacionadas con el texto que es un conocimiento realmente esencial, incluso para el principiante de python. ¡Te alegrarás de haber puesto el tiempo! Y la comunidad de python es útil, así que, ¿por qué no te unes a IRC y te veremos en tu canal de python favorito para obtener ayuda en tiempo real?

Mucha suerte, avísame si necesitas más ayuda.

Pijama