2011-10-24 43 views
9

Al usar la división de función de cadena de Python(), ¿alguien tiene un ingenioso truco para tratar los elementos rodeados de comillas dobles como una palabra que no se divide?No divida las palabras comillas dobles con Python string split()?

decir que quiero dividir solamente en el espacio blanco y tengo esto:

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
>>> myStr.split() 
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R'] 

me gustaría tratar cualquier cosa dentro de las comillas dobles como una sola palabra, incluso si están incrustados los espacios en blanco, por lo que lo haría gustaría terminar con el siguiente:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 

O por lo menos esto y entonces voy a despojarse de las comillas dobles:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 

¿Alguna sugerencia no regex?

Respuesta

30

Ganaste . 't ser capaz de obtener este comportamiento con str.split() Si se puede vivir con el bastante complejo análisis que hace (como ignorar comillas dobles precedidas por una barra invertida), shlex.split() podría ser lo que buscas:

>>> shlex.split(myStr) 
['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 
+2

+100, wow, nunca escuché de shlex –

+1

Gracias Sven --- ¡eso es exactamente lo que estoy buscando! – Rob

+0

impresionante, muy útil. ¡Gracias! – liang

0

sugiero que busque con re para el patrón "[^"] *" y se aplican string.split sólo en las partes restantes. Se podría implementar una función recursiva que procesa todas las partes de cuerda pertinentes.

1

@Rob: ¿por qué sin expresiones regulares si la solución de expresiones regulares es tan simple?

my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
print re.findall(r'(\w+|".*?")', my_str) 
['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 
+0

+1 ¡Muy buena solución! – hochl

+0

@PabloG: a pesar de ser a menudo la solución fácil por adelantado, aún no he encontrado personalmente un caso en el que la expresión regular no tenga más costos a largo plazo. En cuanto a este caso específico, estaba bastante seguro de que este era un problema resuelto y solo pude encontrarlo --- parece que Sven me apuntó en la dirección correcta con shlex. – Rob

Cuestiones relacionadas