我有一个数据结构,如下一个非常格式的数据文件:如何更换连续的空格的字符串在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