Dividir en espacios, excepto entre ciertos personajes.

Estoy analizando un archivo que tiene líneas como

 tipo ("libro") título ("manzanas de oro") páginas (10-35 70 200-234) comentarios ("buena lectura")

Y quiero dividir esto en campos separados.

En mi ejemplo, hay cuatro campos: tipo, título, páginas y comentarios.

El resultado deseado después de dividir es

 ['tipo ("libro")', 'título ("manzanas de oro")', 'páginas (10-35 70 200-234)', 'comentarios ("buena lectura")]

Es evidente que una simple división de cadenas no funcionará, porque simplemente se dividirá en cada espacio. Quiero dividir en espacios, pero preservar cualquier cosa entre paréntesis y comillas.

    ¿Cómo puedo dividir esto?

    Esta expresión regular debería funcionar para usted \s+(?=[^()]*(?:\(|$))

     result = re.split(r"\s+(?=[^()]*(?:\(|$))", subject) 

    Explicación

     r""" \s # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) + # Between one and unlimited times, as many times as possible, giving back as needed (greedy) (?= # Assert that the regex below can be matched, starting at this position (positive lookahead) [^()] # Match a single character NOT present in the list “()” * # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) (?: # Match the regular expression below # Match either the regular expression below (attempting the next alternative only if this one fails) \( # Match the character “(” literally | # Or match regular expression number 2 below (the entire group fails if this one fails to match) $ # Assert position at the end of a line (at the end of the string or before a line break character) ) ) """ 

    Dividir en ") " y agregar a ) nuevo a cada elemento excepto el último.

    Yo trataría de usar una afirmación de look-behind positivo.

     r'(?<=\))\s+' 

    Ejemplo:

     >>> import re >>> result = re.split(r'(?<=\))\s+', 'type("book") title("golden apples") pages(10-35 70 200-234) comments("good read")') >>> result ['type("book")', 'title("golden apples")', 'pages(10-35 70 200-234)', 'comments( "good read")']