2011-01-14 5 views
7

In Python, mi piacerebbe dividere una stringa usando un elenco di separatori. I separatori potrebbero essere virgole o punti e virgola. Gli spazi bianchi dovrebbero essere rimossi a meno che non sia nel mezzo di caratteri non spazi bianchi, non separatori, nel qual caso dovrebbe essere preservato.Python: stringa divisa per lista di separatori

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

Suona come un caso per le espressioni regolari, che va bene, ma se è più facile o più pulito da fare in un altro modo sarebbe ancora meglio

Grazie!

risposta

15

Questo dovrebbe essere molto più veloce allora regex e si può passare un elenco di separatori come si voleva:

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)] 

Come si usa: prova

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

Performance:

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

Molto bello. Devo scegliere questa come la migliore risposta. ringrazia tutti! – blah238

+0

SO compatta gli spazi bianchi, ci sono più di due spazi bianchi consecutivi nella stringa sopra – fabrizioM

+0

Per fortuna ci sarà sempre una virgola o un punto e virgola. – blah238

5

Uso delle espressioni regolari, provare

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

o

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

senza.

+0

Piuttosto esegui la stringa 'split()' per evitare di importare 're', ad es. ''ABC, DEF123, GHI_JKL, MN OP'.split (', |; ')' – marcog

+1

@macrog: Non dividerebbe la stringa in tutte le occorrenze letterali di "", |; "'? –

+0

Funziona alla grande !! Grazie :) – blah238

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

In corso e sopra la risposta, con i casi di test, si desidera utilizzare un'espressione regolare e uno o più caratteri di separazione. Nel tuo caso, i caratteri di separazione sembrano essere ",", "|", ";" e spazi bianchi. Lo spazio bianco in pitone è '\ w', quindi la comprensione è:

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

non posso rispondere Sven di risposta di cui sopra, ma ho diviso su uno o più dei caratteri all'interno delle parentesi, e non c'è bisogno di usare il metodo strip().

Yikes, non ho letto correttamente la domanda ... La risposta di Sven con la striscia funziona; la mia presuppone che lo spazio bianco sia un'altra separazione.