2010-03-22 28 views
21

tengo una cadena con formato de un archivo de registro, que se parece:Python: Dividir por 1 o más ocurrencias de un delimitador

>>> a="test       result" 

es decir, la prueba y el resultado se dividen por algunos espacios - se probablemente fue creado usando una cadena formateada que dio test un espaciado constante.

división simple no va a hacer el truco:

>>> a.split(" ") 
['test', '', '', '', ... '', '', '', '', '', '', '', '', '', '', '', 'result'] 

split(DELIMITER, COUNT) aclarado algunos valores innecesarios:

>>> a.split(" ",1) 
['test', '       result'] 

Esto ayudó - pero, por supuesto, que realmente necesita:

['test', 'result'] 

Puedo usar split() seguido de map + strip(), pero me preguntaba si hay una forma más pitonica de hacerlo.

Gracias,

Adam

ACTUALIZACIÓN: una solución tan simple! Gracias a todos.

Respuesta

39

¿No da ningún delímetro?

>>> a="test       result" 
>>> a.split() 
['test', 'result'] 
+9

En cuanto a por qué esto funciona: a.split (Ninguno) es un caso especial, que en Python significa "dividir en uno o más caracteres en blanco". re.split() es la solución de caso general. –

+1

Se necesita usar str.split (None, maxsplit) ya que la función no acepta argumentos de palabra clave. Me pregunto porque. – tbrittoborges

+0

la pregunta era cómo dividir con delimiter + (uno o más). Tu respuesta dice que cualquiera de los espacios en blanco se tomará como delimitador, que no es la respuesta correcta – Risinek

16

Sólo esto debería funcionar:

a.split() 

Ejemplo:

>>> 'a  b'.split(' ') 
['a', '', '', '', '', '', 'b'] 
>>> 'a  b'.split() 
['a', 'b'] 

Desde el documentation:

Si no se especifica SEP o es Ninguno, se aplica un algoritmo de división diferente : las ejecuciones de espacios en blanco consecutivos se consideran como un único separador, y el resultado no contendrá cadenas vacías en el start o end si la cadena tiene espacios en blanco iniciales o finales. En consecuencia, dividir una cadena vacía o una cadena que consta de solo espacios en blanco con un separador Ninguno devuelve [].

25
>>> import re 
>>> a="test       result" 
>>> re.split(" +",a) 
['test', 'result'] 

>>> a.split() 
['test', 'result'] 
+1

Cool. Podría ayudar con otros delimitadores que no sean espacios en blanco. –

+1

re.split ('\ W +', mystring) es más equivalente string.split (Ninguno). –

+5

Esta es la única respuesta a la solicitud real, "dividida por 1 o más apariciones de un delimitador". –

4

Cualquier problema sencillo a.split()?

+0

Aparentemente, Ninguno. –

+0

la pregunta era cómo dividir con delimiter + (uno o más). Tu respuesta es diciendo que cualquiera de los espacios en blanco se tomará como delimitador, lo cual no es correcto. – Risinek

0

Simplemente añadiendo una forma más, más útil en los casos en que el delimitador es diferente del espacio, y s.split() no funcionará.

como str = "Python, es ,, más ,,,,, flexible".

In [27]: s = "Python is more  flexible" 

In [28]: str_list = list(filter(lambda x: len(x) > 0, s.split(" "))) 

In [29]: str_list 
Out[29]: ['Python', 'is', 'more', 'flexible'] 
Cuestiones relacionadas