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

时间:2015-01-17 19:10:49

标签: python regex string

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

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

相反,小数位与排列前的位置对齐?

2 个答案:

答案 0 :(得分:2)

你必须添加更多逻辑来决定是否要调整或调整等等。但这应该让你开始。可能需要付费才能将'{:.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

答案 1 :(得分:1)

从Padraic的comment中获取线索我试过这个并且它正在工作

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