2012-06-26 6 views
5

Czy każdy może znaleźć bardziej Pythoniczne, piękniejsze rozwiązanie?Znajdowanie podwójnych spacji w łańcuchu znaków - Python

Pętlę niektórych linii tekstu w pliku, aby sprawdzić, czy spełniają określone kryteria. Z jakiegoś powodu zdecydowano, że separatory wewnętrznie w linii to '', tj. Podwójna spacja.

Jak sprawdzić ciąg tekstowy, aby sprawdzić, czy wszystkie separatory są dokładnie dwiema spacjami? Spacje na końcu wiersza nie stanowią problemu, ponieważ linia jest początkowo .strip() 'ed.

Napisałem to i działa - ale jest brzydkie. Kod zostanie pokazany na niektóre Python newbie, więc szukam krótszym, bardziej przejrzyste i piękne rozwiązanie ...

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 

Odpowiedz

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

To działa, ponieważ string.split będzie podzielić ciąg na każdej spacji. i string.join dołącza do listy z separatorem string. W tym przypadku używamy separatora ' ' (dwa spacje), aby ponownie połączyć łańcuch, a następnie porównać go z wersją pozbawioną kolorów (wyczuwam, że już wiesz, co robi pasek).

** Spowoduje to zignorowanie białych znaków na przedniej stronie napisu, jak również na końcu.

+0

Ładne, małe porównanie. Po prostu usunę całą górną część i dokonam edycji Twojej aktualnej odpowiedzi – jdi

+0

@jdi - Dobra uwaga. Zawsze chcę zostawić te rzeczy, ponieważ czuję, że wkładam w to trochę pracy, ale masz rację, że jeśli nie odpowie na to pytanie, powinno zostać usunięte. – mgilson

+1

+1 czysta odpowiedź. Pomogłbym następnemu facetowi (np. Mojej przyszłej osobie) z 'def is_doublespace_separated():' poprzedzającą. – msw

4

Oto szybkie rozwiązanie:

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 

I jeszcze trochę prostsze podejście:

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

Zakłada to nie powinno być 1 mniej niż ilość separatorów są pola.

+0

Sprytny. Podoba mi się twoja druga. – mgilson

+0

@mgilson: Twoja jest * szybsza * włosy – jdi

+0

naprawdę? Domyśliłbym się, że jesteś szybszy. Oboje mamy jedno 'split' i jedno' strip', spodziewałbym się, że 'count' będzie szybszy niż' join', a porównanie liczb całkowitych jest zdecydowanie szybsze niż porównanie ciągu ... Weird. Czy długość sznurka ma znaczenie? – mgilson

0

Aby sprawdzić, czy ta linia ma tylko podwójne spacje można użyć wyrażenia regularnego (choć split/dołączyć do rozwiązania przez @mgilson może być zarówno prostsze i bardziej efektywne):

import re 

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

Uwaga: to robi” • zezwól na spóźnienie podwójnej spacji przed znakiem nowej linii, example.