2014-11-25 34 views
1

我有一個數據結構,如下一個非常格式的數據文件:如何更換連續的空格的字符串在python

" id1 id2    id3   id4" 
" id1 id2   id3   id4" 
" id1  id2    id3   id4" 

我應該在每一行獲取的空間中的每一行ID2和ID4,但數ids之間不同。有沒有一種方法可以用'/ t'等字符替換每行中的所有連續空格,以便我可以檢索每行中的第二和第四項?! 我感謝任何幫助。

+0

程序設計師的軍隊幫助你:) – Hackaholic 2014-11-25 12:43:47

+0

@Hackaholic:而且令人驚訝的沒有downvotes(到目前爲止)對這個問題缺乏的代碼。 :) – 2014-11-25 12:56:00

+1

從下面的答案可以看出,無需清理格式化,因爲'split()'快樂地處理可變數量的空格,編寫處理它們的正則表達式也很容易。但我想如果你需要經常訪問它,重新格式化文件會更有效率。請注意,基於分割的解決方案比基於正則表達式的解決方案快2到3倍。請參閱[這個答案](http://stackoverflow.com/a/27099374/4014959)我昨天發佈,其中包含比較正則表達式與分裂在有些相似的情況下的時間數據。 – 2014-11-25 13:06:20

回答

8

最簡單的方法是做一個.split()自動分割任意數量的空格字符,而忽略前後空白:

>>> s = " id1 id2    id3   id4" 
>>> items = s.split() 
>>> items 
['id1', 'id2', 'id3', 'id4'] 

這樣的話,您可以直接訪問items[1]items[3]。如果你想他們重建成一個製表符分隔字符串,可以使用.join()

>>> "\t".join(items) 
'id1\tid2\tid3\tid4' 
1

你只需要拆分得到的元素:

s = " id1 id2    id3   id4" 
frst,sec,th,frth = s.split() 
print(sec,frth) 
id2 id4 
1
>>> s = " id1 id2    id3   id4" 
>>> s.split() 
['id1', 'id2', 'id3', 'id4'] 
>>> '\t'.join(s.split()) 
'id1\tid2\tid3\tid4' 
>>> print '\t'.join(s.split()) 
id1  id2  id3  id4 

要提取id2id4使用索引與str.split

>>> a, b = s.split()[1], s.split()[3] 
>>> a, b 
('id2', 'id4') 
+0

將您的混合索引和解包方法與Paddy純粹的基於解包的答案進行比較的時機比較有趣。 – 2014-11-25 13:11:22

+0

@ PM2Ring yes我的方法(每個循環723 ns)比Padraic Cunningham解決方案(每個循環511 ns)慢。但我存儲的變量也較少。但感謝您的考慮。 – 2014-11-25 13:18:03

+0

謝謝你不厭其煩地做出時間表。我懷疑你的方式會變慢,但我不確定。我想實際的相對速度會因實現而有所不同。 – 2014-11-25 13:26:48

1
import re 
re.sub(' +', ' ', string) 
3

使用應用re.sub

>>> import re 
>>> s = " id1 id2    id3   id4" 
>>> re.sub('\s+',' ',s.strip()) 
'id1 id2 id3 id4' 

您可以使用拆分和切片:用re.findall

>>> s = " id1 id2    id3   id4" 
>>> s.split()[1::2] 
['id2', 'id4'] 

>>> s = " id1 id2    id3   id4" 
>>> re.findall('id[24]',s) 
['id2', 'id4'] 
+0

很好的使用切片。我認爲你應該使用'split()'而不是僅顯示基於正則表達式的答案。 – 2014-11-25 13:09:35

+0

@ PM2Ring感謝您的支持:) – Hackaholic 2014-11-25 13:10:30

0

這還不是最優雅的方式來做到這一點,但容易理解。該功能用一個空格替換連續的空格。

def remove_extra_spaces(s): 
    s_res = "" 
    flip = False 
    for c in s: 
     if c == ' ': 
      # first one is ok, next ones not 
      if not flip: 
       s_res += c 
      flip = True 
     else: 
      flip = False 
      s_res += c 

    return s_res 
相關問題