在python中使用split()和join()时保留空格

时间:2013-03-22 20:25:19

标签: python join split

我有一个包含

等列的数据文件
BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77

并且各列以不同数量的空格分隔。

我的目标是读取这些行,对几行进行一些数学运算,例如将第4列乘以.95,然后将它们写入新文件。新文件应该与原始文件类似,但我修改的值除外。

我的方法是将行读作列表项。然后我会在我感兴趣的那些行上使用split(),这会给我一个包含各个列值的子列表。然后我一起修改join()列,并将列表中的行写入新的文本文件。

问题是我有不同数量的空白。我不知道如何以我读它们的方式将它们引回来。我能想到的唯一方法是在分割它们之前对行中的字符进行计数,这将非常繁琐。有人有更好的想法来解决这个问题吗?

3 个答案:

答案 0 :(得分:25)

在这种情况下,你想使用re.split()和一个组:

re.split(r'(\s+)', line)

会返回列这两个空格,以便稍后可以使用相同数量的空格重新加入该行。

示例:

>>> re.split(r'(\s+)', line)
['BBP1', '   ', '0.000000', '  ', '-0.150000', '    ', '2.033000', '  ', '0.00', ' ', '-0.150', '   ', '1.77']

你可能想要从最后删除换行符。

答案 1 :(得分:3)

对于在开头和/或结尾处带有空格的行,更健壮的模式是(\S+),用于拆分非空格字符:

import re

line1 = ' 4   426.2   orange\n'
line2 = '12    82.1   apple\n'

re_S = re.compile(r'(\S+)')
items1 = re_S.split(line1)
items2 = re_S.split(line2)
print(items1)  # [' ', '4', '   ', '426.2', '   ', 'orange', '\n']
print(items2)  # ['', '12', '    ', '82.1', '   ', 'apple', '\n']

这两行分割后的项目数相同,这很方便。第一项和最后一项都是总是空格字符串。这些行可以使用零长度字符串的连接来重构:

print(repr(''.join(items1)))  # ' 4   426.2   orange\n'
print(repr(''.join(items2)))  # '12    82.1   apple\n'

为了将示例与此处另一个答案中使用的相似模式(\s+)(小写)进行对比,每行以不同的结果长度和项的位置进行分割:

re_s = re.compile(r'(\s+)')
print(re_s.split(line1))  # ['', ' ', '4', '    ', '20.0', '   ', 'orange', '\n', '']
print(re_s.split(line2))  # ['12', '    ', '82.1', '   ', 'apple', '\n', '']

如您所见,以一致的方式处理起来会更加困难。

答案 2 :(得分:2)

其他方法是:

s = 'BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77'
s.split(' ')
>>> ['BBP1', '', '', '0.000000', '', '-0.150000', '', '', '', '2.033000', '', '0.00', '-0.150', '', '', '1.77']

如果我们在split函数中指定空格字符参数,它会创建列表而不会吃连续的空格字符。因此,在“加入”功能之后,原始的空格字符数将被恢复。