回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>为了解决将浮点数与表格式数字数据的十进制分隔符对齐的问题,我尝试使用以下规则找到一个正则表达式,将(全局后验)尾随的零替换为空格:</p>
<ol>
<li>小数后没有尾随的零</li>
<li>如果小数分隔符后的第一个数字是零,则保留它</li>
</ol>
<p>由于pythonregex引擎对look-behind要求固定宽度模式的限制,我无法找到一个令人满意的解决方案。以下是我的尝试(Python 3.x)的一个有效示例;<strong>在解决方案中不依赖垂直条,</strong>在示例中只是为了清晰起见:</p>
<pre><code>import re
# formatmany is just a way to speed up building of multiline string of tabular data
formatmany=lambda f:lambda *s:'\n'.join(f.format(*x) for x in s)
my_list = [[12345, 12.345, 12.345, 12.345],
[12340, 12.34 , 12.34 , 12.34 ],
[12345, 12.005, 12.005, 12.005],
[12340, 12.04 , 12.04 , 12.04 ],
[12300, 12.3 , 12.3 , 12.3 ],
[12000, 12.0 , 12.0 , 12 ]]
my_format = formatmany('|{:8d}|{:8.2f}|{:8.3f}|{:8.4f}|')
my_string = my_format(*my_list) # this is the formatted multiline string with trailing zeros
print('\nOriginal string:\n')
print(my_string)
print('\nTry 1:\n')
print(re.sub(r'(?<!\.)0+(?=[^0-9\.]|$)',lambda m:' '*len(m.group()),my_string))
print('\nTry 2:\n')
print(re.sub(r'(\d)0+(?=[^\d]|$)',r'\1',my_string))
</code></pre>
<p>哪个指纹</p>
^{pr2}$
<p>Try 1替换尾随的零也在整数中,Try 2取自另一个在单个浮点中替换尾随零的解决方案。两者都不令人满意,因为期望的输出应为:</p>
<pre><code>| 12345| 12.35| 12.345| 12.345 |
| 12340| 12.34| 12.34 | 12.34 |
| 12345| 12.01| 12.005| 12.005 |
| 12340| 12.04| 12.04 | 12.04 |
| 12300| 12.3 | 12.3 | 12.3 |
| 12000| 12.0 | 12.0 | 12.0 |
</code></pre>
<p><strong>为什么这不是一个重复的问题</strong></p>
<ol>
<li>Python正则表达式引擎与其他语言引擎略有不同,因此针对其他语言的解决方案不会自动应用</li>
<li>后面的零将被替换,而不是去掉</li>
<li>这是关于全局替换多行字符串中的多个事件,而不仅仅是单个事件</li>
</ol>