Dividir una cadena por espacios (preservando las subcadenas entrecomilladas) en Python
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á".
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=False
kwarg.
>>> shlex.split('this is "a test"', posix=False)
['this', 'is', '"a test"']
Eche un vistazo al shlex
módulo, en particular shlex.split
.
>>> import shlex
>>> shlex.split('This is "a test"')
['This', 'is', 'a test']
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.