2011-01-14 22 views
7

En Python, me gustaría dividir una cadena utilizando una lista de separadores. Los separadores pueden ser comas o punto y coma. El espacio en blanco debe eliminarse, a menos que esté en el medio de caracteres que no sean espacios en blanco, que no sean separadores, en cuyo caso debe conservarse.Python: dividir cadena por lista de separadores

caso de prueba 1: ABC,DEF123,GHI_JKL,MN OP
caso de prueba 2: ABC;DEF123;GHI_JKL;MN OP
caso de prueba 3: ABC ; DEF123,GHI_JKL ; MN OP

Suena como un caso de expresiones regulares, lo cual está bien, pero si es más fácil o más limpia que hacer de otra manera eso sería aún mejor.

Gracias!

Respuesta

15

Esto debería ser mucho más rápido que la expresión regular y se puede pasar una lista de separadores, ya que queríamos:

def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

Cómo se usa: Prueba

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

Rendimiento:

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

Muy agradable. Tengo que escoger esto como la mejor respuesta. ¡gracias a todos! – blah238

+0

SO compacta los espacios en blanco, hay más de dos espacios en blanco consecutivos en la cadena por encima de – fabrizioM

+0

Afortunadamente siempre habrá coma o punto y coma. – blah238

5

Uso de expresiones regulares, tratar

[s.strip() for s in re.split(",|;", string)] 

o

[t.strip() for s in string.split(",") for t in s.split(";")] 

sin.

+0

Rather hacerlo a través de 'split()' de cadena para evitar la importación de 're', p. ''ABC, DEF123, GHI_JKL, MN OP'.split (', |; ')' – marcog

+1

@macrog: ¿Esto no dividiría la cadena en todas las apariciones textuales de '", |; "'? –

+0

¡Funciona muy bien! Gracias :) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

Taking th Por encima de la respuesta, con sus casos de prueba, quiere usar una expresión regular, y uno o más caracteres de separación. En su caso, los caracteres de separación parecen ser ',', '|', ';' y espacio en blanco El espacio en blanco en Python es '\ w', por lo que la comprensión es:

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

no puedo responder a Sven respuesta anterior, pero dividido en uno o más de los caracteres dentro de los corchetes, y no tener que utilizar el método strip()

Sí, no leí la pregunta correctamente ... La respuesta de Sven con los trabajos de la tira; el mío supone que el espacio en blanco es otra separación.

Cuestiones relacionadas