Análisis de listas TCL en Python

Necesito dividir las listas TCL delimitadas por el espacio entre llaves dobles … por ejemplo …

OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}""" 

Esto debería analizar en …

 OUTPUT = ["""{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}""", """{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}"""] 

Yo he tratado…

 import re splitter = re.compile('}}\s+{{') splitter.split(OUTPUT) 

Sin embargo, eso recorta los tirantes en el centro …

 ['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}', '172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}'] 

No puedo averiguar cómo dividir solamente en los espacios entre }} {{ . Sé que puedo engañar e insertar llaves faltantes manualmente, pero preferiría encontrar una forma sencilla de analizar esto de manera eficiente.

¿Hay una manera de analizar OUTPUT con re.split (o algún otro marco de análisis de Python) para un número arbitrario de filas delimitadas por espacios que contengan {{content here}} ?

Podría modificar su expresión regular para usar aserciones positivas de lookahead / behind, que no consumen ninguna de las cadenas:

 re.compile('(?<=}})\s+(?={{)') 

Pyparsing ha mejorado desde esa discusión con comp.lang.python, y creo que incluso Cameron Laird no se quejaría de una solución que utiliza el método nestedExpr de nestedExpr :

 OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}""" from pyparsing import nestedExpr, originalTextFor nestedBraces1 = nestedExpr('{', '}') for nb in nestedBraces1.searchString(OUTPUT): print nb nestedBraces2 = originalTextFor(nestedExpr('{', '}')) for nb in nestedBraces2.searchString(OUTPUT): print nb 

Huellas dactilares:

 [[['172.25.50.10:01:01-Ethernet', '172.25.50.10:01:02-Ethernet', ['Traffic', 'Item', '1']]]] [[['172.25.50.10:01:02-Ethernet', '172.25.50.10:01:01-Ethernet', ['Traffic', '"Item 1"']]]] ['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}'] ['{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}'] 

Si va a tener que volver a escribir los datos para obtener los elementos individuales de las llaves anidadas, entonces la salida de la lista anidada original de nestedExpr podría ser de mejor ayuda (tenga en cuenta que incluso si una cadena entre comillas está en la lista, el elemento entre comillas es mantenido como su propio artículo). Pero si realmente quieres esa cadena que contiene las llaves anidadas, entonces usa el formulario con originalTextFor muestra en nestedBraces2 .

Puede utilizar una expresión regular para extraer, en lugar de separar, los valores de los elementos de la lista …

 re.findall(r'({{.*?}})(?:\Z|\s+)', OUTPUT) 

Por ejemplo:

 In [30]: regex = re.compile(r'({{.*?}})(?:\Z|\s+)') In [31]: regex.findall(OUTPUT) Out[31]: ['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}', '{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}']