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

python join split

8759 观看

3回复

0 作者的声誉

我有一个像列一样的数据文件

BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77

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

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

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

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

作者: user2015601 的来源 发布者: 2013 年 3 月 22 日

回应 3


25

749655 作者的声誉

决定

你想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']

您可能确实想要从最后删除换行符。

作者: Martijn Pieters 发布者: 2013 年 3 月 22 日

2

493 作者的声誉

其他方法是:

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函数中指定空格字符参数,它会创建列表而不会吃连续的空格字符。因此,在“连接”功能之后,原始的空格字符数将被恢复。

作者: Gaurav Bishnoi 发布者: 2017 年 7 月 8 日

3

24856 作者的声誉

对于在开头和/或结尾处有空格的行,更健壮的模式是(\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', '']

如您所见,这将以一致的方式处理起来有点困难。

作者: Mike T 发布者: 2018 年 11 月 20 日
32x32