una separar separador por palabras palabra lista letras funcion espacios elementos concatenar como python split escaping quotes

separador - separar python



¿Cómo puedo analizar una cadena delimitada por comas en una lista(advertencia)? (6)

Necesito poder tomar una cadena como:

''''''foo, bar, "one, two", three four''''''

dentro:

[''foo'', ''bar'', ''one, two'', ''three four'']

Tengo la sensación (con sugerencias de #python) de que la solución involucrará el módulo shlex.


Depende de lo complicado que desee obtener ... ¿desea permitir más de un tipo de cotización? ¿Qué hay de las frases escapadas?

Su sintaxis se parece mucho al formato de archivo CSV común, que es compatible con la biblioteca estándar de Python:

import csv reader = csv.reader([''''''foo, bar, "one, two", three four''''''], skipinitialspace=True) for r in reader: print r

Productos:

[''foo'', ''bar'', ''one, two'', ''three four'']

HTH!


La solución del módulo shlex permite que las comillas escapadas, una cita escape de otra, y todas las cosas fantásticas sean compatibles con el shell.

>>> import shlex >>> my_splitter = shlex.shlex(''''''foo, bar, "one, two", three four'''''', posix=True) >>> my_splitter.whitespace += '','' >>> my_splitter.whitespace_split = True >>> print list(my_splitter) [''foo'', ''bar'', ''one, two'', ''three'', ''four'']

Ejemplo de citas escapadas:

>>> my_splitter = shlex.shlex(''''''"test, a",''foo,bar",baz'',bar /xc3/xa4 baz'''''', posix=True) >>> my_splitter.whitespace = '','' ; my_splitter.whitespace_split = True >>> print list(my_splitter) [''test, a'', ''foo,bar",baz'', ''bar /xc3/xa4 baz'']


Podrías hacer algo como esto:

>>> import re >>> pattern = re.compile(r''/s*("[^"]*"|.*?)/s*,'') >>> def split(line): ... return [x[1:-1] if x[:1] == x[-1:] == ''"'' else x ... for x in pattern.findall(line.rstrip('','') + '','')] ... >>> split("foo, bar, baz") [''foo'', ''bar'', ''baz''] >>> split(''foo, bar, baz, "blub blah"'') [''foo'', ''bar'', ''baz'', ''blub blah'']


Si no necesita ser bonita, esto podría ponerlo en su camino:

def f(s, splitifeven): if splitifeven & 1: return [s] return [x.strip() for x in s.split(",") if x.strip() != ''''] ss = ''foo, bar, "one, two", three four'' print sum([f(s, sie) for sie, s in enumerate(ss.split(''"''))], [])


También puede considerar el módulo csv . No lo he intentado, pero parece que tus datos de entrada están más cerca del CSV que de la sintaxis del shell (que es lo que analiza el shlex).


Yo diría que una expresión regular sería lo que estás buscando aquí, aunque no estoy muy familiarizado con el motor Regex de Python.

Suponiendo que usa coincidencias flojas, puede obtener un conjunto de coincidencias en una cadena que puede poner en su matriz.