使用 re.sub 替换不同大小的十进制数时对齐小数位



在我看来,用更大的字符串替换匹配字符串的默认行为是从匹配字符串的起始位置开始替换,即。

import re
string = "Parameter Value:     0.12345"
new = re.sub(r'(d|.)+', '%0.5f' % 100.123, string) 
print string+'n'+new

给出输出:

Parameter Value:     0.12345
Parameter Value:     100.12300

这似乎是默认行为,但是有没有办法获得:

Parameter Value:     0.12345
Parameter Value:   100.12300

相反,以便小数位与替换前的位置对齐?

你将不得不添加更多的逻辑来决定是 ljust 还是 rjust 等,但这应该让你开始。 可能需要将'{:.5f}'.format(100.123)移出正则表达式并将其长度用作决定因素

import re
s = "Parameter Value:     0.12345"
new = re.sub(r'(d|.)+', '{:.5f}'.format(100.123), s)
s = s.split(" ")
new = new.split(" ")
a, b = s[-1], new[-1]
ln = len(max(a, b, key=len))
print("{}{:>{ln}}n{}{}".format(" ".join(s[:-1]), a, " ".join(new[:-1]), b, ln=ln)))
Parameter Value:      0.12345
Parameter Value:    100.12300
另一种方法是获取要替换的字符串的

开始和结束索引,一旦您确切知道字符串的位置以及要替换的字符串与 rep 相比有多长,就很容易调整字符串:

import re
f = 100.123
rep = '{:.5f}'.format(f)
s = "Parameter Value:     0.12345"
inds = next(re.finditer(r'(d|.)+', s))
start, end = inds.span()
print(start,end)
(21, 28)
ln = end - start

从帕德拉克的评论中获取线索,我试过这个,它正在工作

>>> string = "Parameter Value:     0.12345"
>>> s = string.split(":")
>>> num = 100.123
>>> ":".join([s[0],("%0.5f"%(num)).rjust(len(s[1]))])
'Parameter Value:   100.12300'
>>> string
'Parameter Value:     0.12345'

最新更新