我在文件中有这样的字符串:
2381 OH 209 SER OG 1049 -0.6546 16 ; qtot 1.543
我希望用不同的数字替换一些数字(第1和第6,“2381”和“1049”),但保持对齐,即根据需要在数字之前添加或删除空格。也就是说,我会将2381
替换为__24
(_
为空白)或_1049
替换37628
。
我可以对每个数字的确切位置进行硬编码,但是对于不同的文件,这些可能会有所不同。我想要更多样化的东西。
任何人都可以帮我在python中这样做吗?说代码是这样的:
# list_a and list_b contain two different mappings between integer numbers
for line in file:
(a, b) = (int(line.split()[0]), int(line.split()[5]))
c = list_a[a]
d = list_b[b]
# create "modline", as "line" where (a,b) are replaced with (c,d)
print modline
如果重要,映射list_a
和list_b
只是数字a
,b
的出现顺序。所以,如果输入文件有:
2381 OH 209 SER OG 1049 -0.6546 16 ; qtot 1.543
2382 HO 209 SER HG 1049 0.4275 1.008 ; qtot 1.971
2379 C 209 SER C 1048 0.5973 12.01 ; qtot 2.568
2380 O 209 SER O 1048 -0.5679 16 ; qtot 2
我希望它成为:
1 OH 209 SER OG 1 -0.6546 16 ; qtot 1.543
2 HO 209 SER HG 1 0.4275 1.008 ; qtot 1.971
3 C 209 SER C 2 0.5973 12.01 ; qtot 2.568
4 O 209 SER O 2 -0.5679 16 ; qtot 2
因为2381
出现在第1位,2380
出现在第4位; 1049
出现在第1位(在其列中),等等list_a[2381] = 1
和list_b[1049] = 1
。
但是我想我知道怎么做,我现在的问题实际上是在替换字符串中的数字,同时考虑到可变数量的空格。
我应该补充说,不能保证每行中的数字都是唯一的,所以我不能简单地依赖正则表达式匹配。我必须替换第1和第6个数字,而不是“2381
”的每个(或第一个)实例
答案 0 :(得分:1)
回答我自己的问题,我认为这样做:
# list_a and list_b contain two different mappings between integer numbers
for line in file:
words = re.findall("(\s*\S+)", line)
a = int(words[0])
b = int(words[5])
c = list_a[a]
d = list_b[b]
modline = str(c).rjust(len(words[0])) + "".join(words[1:5]) + str(d).rjust(len(words[5])) + "".join(words[6:])
print modline
也就是说,忘掉简单的split
并从头开始去正则表达式。我几乎可以保证的是,原始字符串中将有足够的空格来替换字符串以适应那里(否则我必须更改原始文件中的对齐方式,这是一个不同的野兽)。
答案 1 :(得分:0)
如下所示:
yourstring.replace(' 2381 ',' 24 ')
以下是我会这样做的(我认为):
def same_space_replace(s,fld,rep):
fld = fld.rjust(len(rep)) #could use `.ljust` or `.center` as well.
rep = rep.rjust(len(fld))
return s.replace(fld,rep)
for line in file:
split_line = line.split()
a = split_line[0]
rep_a = str(list_a[int(a)])
b = split_line[1]
rep_b = str(list_b[int(b)])
modline = same_space_replace(line,a,rep_a)
modline = same_space_replace(line,b,rep_b)
答案 2 :(得分:0)
动态地做这样的事情:
# example with a being 2381 and b being 1049
modeline = line.replace(a, list_a[a].rjust(len(a), ' ')).replace(b, list_b[b].rjust(len(b), ' ')
因此,这使用与旧版本相同数量的空格来对新数字进行右对齐以保持空白,因此2381
将转换为__24
(_为空格)