我有一個數據結構,如下一個非常格式的數據文件:如何更換連續的空格的字符串在python
" id1 id2 id3 id4"
" id1 id2 id3 id4"
" id1 id2 id3 id4"
我應該在每一行獲取的空間中的每一行ID2和ID4,但數ids之間不同。有沒有一種方法可以用'/ t'等字符替換每行中的所有連續空格,以便我可以檢索每行中的第二和第四項?! 我感謝任何幫助。
我有一個數據結構,如下一個非常格式的數據文件:如何更換連續的空格的字符串在python
" id1 id2 id3 id4"
" id1 id2 id3 id4"
" id1 id2 id3 id4"
我應該在每一行獲取的空間中的每一行ID2和ID4,但數ids之間不同。有沒有一種方法可以用'/ t'等字符替換每行中的所有連續空格,以便我可以檢索每行中的第二和第四項?! 我感謝任何幫助。
最簡單的方法是做一個.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'
你只需要拆分得到的元素:
s = " id1 id2 id3 id4"
frst,sec,th,frth = s.split()
print(sec,frth)
id2 id4
>>> 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
要提取id2
和id4
使用索引與str.split
>>> a, b = s.split()[1], s.split()[3]
>>> a, b
('id2', 'id4')
將您的混合索引和解包方法與Paddy純粹的基於解包的答案進行比較的時機比較有趣。 – 2014-11-25 13:11:22
@ PM2Ring yes我的方法(每個循環723 ns)比Padraic Cunningham解決方案(每個循環511 ns)慢。但我存儲的變量也較少。但感謝您的考慮。 – 2014-11-25 13:18:03
謝謝你不厭其煩地做出時間表。我懷疑你的方式會變慢,但我不確定。我想實際的相對速度會因實現而有所不同。 – 2014-11-25 13:26:48
import re
re.sub(' +', ' ', string)
使用應用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']
很好的使用切片。我認爲你應該使用'split()'而不是僅顯示基於正則表達式的答案。 – 2014-11-25 13:09:35
@ PM2Ring感謝您的支持:) – Hackaholic 2014-11-25 13:10:30
這還不是最優雅的方式來做到這一點,但容易理解。該功能用一個空格替換連續的空格。
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
程序設計師的軍隊幫助你:) – Hackaholic 2014-11-25 12:43:47
@Hackaholic:而且令人驚訝的沒有downvotes(到目前爲止)對這個問題缺乏的代碼。 :) – 2014-11-25 12:56:00
從下面的答案可以看出,無需清理格式化,因爲'split()'快樂地處理可變數量的空格,編寫處理它們的正則表達式也很容易。但我想如果你需要經常訪問它,重新格式化文件會更有效率。請注意,基於分割的解決方案比基於正則表達式的解決方案快2到3倍。請參閱[這個答案](http://stackoverflow.com/a/27099374/4014959)我昨天發佈,其中包含比較正則表達式與分裂在有些相似的情況下的時間數據。 – 2014-11-25 13:06:20