2014-11-25 33 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 
相关问题