2012-06-26 5 views
5

Qualcuno può trovare una soluzione più pitoneica e più bella?Ricerca di doppi spazi in una stringa - Python

Sto collegando alcune righe di testo in un file, per verificare se soddisfano determinati criteri. Per qualche motivo è stato deciso che i separatori all'interno della linea sono "", cioè doppio spazio.

Come si controlla una stringa di testo per verificare che tutti i separatori siano esattamente due spazi? Gli spazi alla fine della linea non sono un problema, poiché la linea è inizialmente .strip() 'ed.

Ho scritto questo e funziona, ma è brutto. Il codice verrà mostrato ad alcuni Python newbie, quindi sto cercando una soluzione più breve, più chiara e più bella ...

ll = ["53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     " 53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     " 53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2 ", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2 ", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2"] 

for ln in ll: 
    l = ln.strip() 
    bolDS = True 
    for n in range(len(l)-1): 
     if (n>0 and l[n]==' ' and not ((l[n]==l[n+1])^(l[n]==l[n-1]))): 
      bolDS = False 

    print "|"+l+"|",bolDS 

risposta

10
def is_doublespace_separated(input_string): 
    return ' '.join(input_string.split()) == input_string.strip() 

Questo funziona perché string.split sarà dividere la stringa su ogni spazio vuoto. e string.join si unisce all'elenco con il separatore string. In questo caso, utilizziamo il separatore ' ' (due spazi) per ricongiungere la stringa e quindi confrontarla con la versione ridotta (ho la sensazione che tu sappia già cosa fa la striscia).

** Questo ignorerà gli spazi bianchi nella parte anteriore della stringa e alla fine.

+0

Bel piccolo confronto. Vorrei solo cancellare l'intera parte superiore e rendere la modifica la tua risposta effettiva – jdi

+0

@jdi - Buon punto. Voglio sempre lasciare quella roba perché mi sembra di aver lavorato un po ', ma hai ragione che se non risolve la questione, dovrebbe essere cancellata. – mgilson

+1

+1 risposta pulita. Aiuterei il prossimo ragazzo (ad esempio il mio futuro io) con un 'def is_doublespace_separated():' precedendolo. – msw

4

Ecco una soluzione rapida:

import re 

s = "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2" 
s2 = "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2" 

def spaceTest(line): 
    matches = re.findall(r'\s+', line.strip()) 
    return not any(m for m in matches if m != ' ') 

print spaceTest(s) 
# False 
print spaceTest(s2) 
# True 

E un altro po 'approccio più semplice:

s.strip().count(' ')+1 == len(s.split()) 

Ciò presuppone ci dovrebbe essere uno meno quantità di separatori che ci sono campi.

+0

Intelligente. Mi piace il tuo secondo. – mgilson

+0

@mgilson: Il tuo è un * capelli * più veloce – jdi

+0

davvero? Avrei immaginato che il tuo fosse più veloce. Entrambi abbiamo uno 'split' e uno' strip', mi aspetterei che 'count' sia più veloce di' join' e il confronto tra interi è decisamente più veloce rispetto alla stringa compare ... Weird. La lunghezza delle corde è importante? – mgilson

0

Per verificare che una linea ha solo doppio-spazi si potrebbe usare un'espressione regolare (anche se split/join soluzione @mgilson potrebbe essere più semplice e più efficiente):

import re 

ok = re.match(r'(?:\S|(?<!\s) (?!\s))*$', line) 

Nota: doesn' t consentire di trascinare il doppio spazio prima di una nuova riga, example.