使用 re.sub 替换大小不一的小数时,将小数位对齐

Line up decimal place when using re.sub to replace decimal numbers of varying size

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

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

另一种方法是获取要替换的字符串的开始和结束索引,一旦您确切知道字符串的位置以及要替换的字符串的长度,就可以很容易地调整字符串比较代表:

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

从 Padraic 的 中得到线索,我尝试了这个并且它有效

>>> 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'