2011-06-25 18 views
5

El método predeterminado split en Python trata espacios consecutivos como un delimitador único. Pero si se especifica una cadena delimitadora, delimitadores consecutivos son no se derrumbó:Python divide delimitadores consecutivos

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

¿Cuál es la forma más directa de colapsar delimitadores consecutivos? Sé que podría eliminar cadenas vacías de la lista de resultados:

>>> result = 'aaa'.split('a') 
>>> result 
['', '', '', ''] 
>>> result = [item for item in result if item] 

¿Pero hay una manera más conveniente?

+0

Parece que podría lograr esto con 're.split' –

+1

¡Interesante! No me di cuenta que 'split()' sin argumentos hizo algo que no pudo ser replicado por 'split' con argumentos. – weronika

Respuesta

7

Se puede utilizar una expresión regular como delimitador, como en:

re.split(pattern, string[, maxsplit=0, flags=0]) 

De the docs.

2

Se puede usar expresiones regulares:

re.split(pattern, string[, maxsplit=0, flags=0]) 

como

re.split('a+', 'aaa') 
+0

[sintaxis de expresiones regulares de Python] (http://docs.python.org/library/re.html#regular-expression-syntax), si es necesario. –

0

No, no hay una manera más conveniente. O bien escribe su propia función de división, o elimina las cadenas vacías.

Pero su solución parece muy clara y pitónica.

0

Aunque no es exactamente lo que usted pidió, usted puede deshacerse de todas las fichas no únicos usando un set:

>>> result 
['', '', ''] 
>>> set(result) 
set(['']) 
10

Esto es lo más concisa como se puede llegar:

string = 'aaa' 
result = [s for s in string.split('a') if s] 

O usted podría cambiar a las expresiones regulares:

string = 'aaa' 
result = re.split('a+', string) 
+0

@anonymous downvote: ¿me importa explicarme? – orlp

+0

¡Gran solución! El patrón 'a +' se dividirá por la mayor cantidad de 'a' consecutivos posible. Por lo tanto, ejecutando 're.split ('a +', string)' devolverá '['', '']'. Diga que 'string = 'baaac'' luego devolvería' [' b ',' c '] '. – DomingoR

1

Creo que su solución es pe perfectamente bien. Aquí hay uno equivalente:

filter(bool, 'aaa'.split('a')) 

Probablemente no sea tan perspicaz como una lista de comprensión, sin embargo.

+1

lo siento, pero esta solución es bastante mala. Además, el filtro cambió en python3 y no tendrá el mismo resultado –

+0

¿Puede explicar por qué es malo (aparte de que su comportamiento cambió en python 3, de lo que no tenía conocimiento)? – jena

+0

porque está agregando una llamada de función a bool (overhead) y lo hace menos legible. –

Cuestiones relacionadas