2012-06-26 95 views
5

任何人都可以找到更多Python'ic,更漂亮的解決方案嗎?在字符串中尋找雙空格 - Python

我正在循環瀏覽文件中的一些文本行,以檢查它們是否符合特定條件。 出於某種原因,決定內部分隔符是'',即雙倍空間。

如何檢查文本字符串以驗證所有分隔符恰好是兩個空格? 行結束處的空格不是問題,因爲行最初是.strip()'ed。

我已經寫了這個,它的工作原理 - 但它很醜。 的代碼將顯示一些Python新手的,所以我在尋找一個更短,更清晰,更漂亮的解決方案...

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 

回答

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

這工作,因爲string.split將在任何空白分割你的字符串。和string.join加入清單string。在這種情況下,我們使用分隔符' '(兩個空格)來重新連接字符串,然後將其與剝離版本進行比較(我感覺到您已經知道strip是什麼)。

**這將忽略字符串前部和末尾的空白。

+0

不錯的比較。我只是刪除整個頂部部分,並編輯你的實際答案 – jdi

+0

@jdi - 好點。我總是想留下那些東西,因爲我覺得我會在其中加入一些工作,但是你說得對,如果它沒有解決問題,就應該刪除它。 – mgilson

+1

+1乾淨的答案。我會幫助下一個人(例如我未來的自己),在它之前有一個「def is_doublespace_separated():」。 – msw

4

這裏是一個快速的解決方案:

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 

還有一點點簡單的方法:

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

這個假設應該有隔板的比有場數量少1。

+0

聰明。我喜歡你的第二個。 – mgilson

+0

@mgilson:你真的是* *頭髮*更快 – jdi

+0

?我會猜你的速度更快。我們都有一個'split'和一個'strip',我期望'count'比'join'更快,整數比較肯定比字符串比較更快......奇怪。字符串長度是否重要? – mgilson

0

要驗證行只有雙空格,你可以使用正則表達式(雖然 分流/由@mgilson加入解決方案可能是更簡單,更高效的):

import re 

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

注意:它不」在換行符之前允許尾隨雙空格,example