Dividir una cadena por espacios (preservando las subcadenas entrecomilladas) en Python

Resuelto Adam Pierce asked hace 16 años • 16 respuestas

Tengo una cadena que es así:

this is "a test"

Estoy intentando escribir algo en Python para dividirlo por espacio mientras ignoro los espacios entre comillas. El resultado que estoy buscando es:

['this', 'is', 'a test']

PD. Sé que vas a preguntar "¿qué pasa si hay comillas dentro de las comillas? Bueno, en mi aplicación, eso nunca sucederá".

Adam Pierce avatar Sep 17 '08 11:09 Adam Pierce
Aceptado

Lo que quieras split, desde el módulo incorporado shlex.

>>> import shlex
>>> shlex.split('this is "a test"')
['this', 'is', 'a test']

Esto debería hacer exactamente lo que quieres.

Si desea conservar las comillas, puede pasar posix=Falsekwarg.

>>> shlex.split('this is "a test"', posix=False)
['this', 'is', '"a test"']
Jerub avatar Sep 17 '2008 04:09 Jerub

Eche un vistazo al shlexmódulo, en particular shlex.split.

>>> import shlex
>>> shlex.split('This is "a test"')
['This', 'is', 'a test']
Allen avatar Sep 17 '2008 04:09 Allen

Veo enfoques de expresiones regulares aquí que parecen complejos y/o incorrectos. Esto me sorprende, porque la sintaxis de expresiones regulares puede describir fácilmente "espacios en blanco o cosas entre comillas", y la mayoría de los motores de expresiones regulares (incluido el de Python) pueden dividirse en una expresión regular. Entonces, si vas a utilizar expresiones regulares, ¿por qué no decir exactamente lo que quieres decir?:

test = 'this is "a test"'  # or "this is 'a test'"
# pieces = [p for p in re.split("( |[\\\"'].*[\\\"'])", test) if p.strip()]
# From comments, use this:
pieces = [p for p in re.split("( |\\\".*?\\\"|'.*?')", test) if p.strip()]

Explicación:

[\\\"'] = double-quote or single-quote
.* = anything
( |X) = space or X
.strip() = remove space and empty-string separators

Sin embargo, shlex probablemente proporcione más funciones.

 avatar Feb 07 '2009 23:02