В качестве обходного пути для выравнивания поплавков к десятичному разделителю для табличных числовых данных я попытался найти регулярное выражение для замены (глобально апостериорных) конечных нулей с пробелами со следующими правилами:Python regex глобально заменить конечные нули пробелами
- нет конечных нулей после десятичной цифры
- , если первая цифра после десятичного разделителя равен нулю, держать его
в связи также Python регулярное выражение двигателя ограничение на внешний вид-сзади, требующих фиксированной ширины шаблона, Я не смог найти удовлетворительного решение. Вот рабочий пример моих попыток (Python 3.x); не полагаться на вертикальных столбиков в вашем решении, они находятся в примере просто для ясности цели:
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))
который печатает
Original string:
| 12345| 12.35| 12.345| 12.3450|
| 12340| 12.34| 12.340| 12.3400|
| 12345| 12.01| 12.005| 12.0050|
| 12340| 12.04| 12.040| 12.0400|
| 12300| 12.30| 12.300| 12.3000|
| 12000| 12.00| 12.000| 12.0000|
Try 1:
| 12345| 12.35| 12.345| 12.345 |
| 1234 | 12.34| 12.34 | 12.34 |
| 12345| 12.01| 12.005| 12.005 |
| 1234 | 12.04| 12.04 | 12.04 |
| 123 | 12.3 | 12.3 | 12.3 |
| 12 | 12.0 | 12.0 | 12.0 |
Try 2:
| 12345| 12.35| 12.345| 12.345|
| 1234| 12.34| 12.34| 12.34|
| 12345| 12.01| 12.005| 12.005|
| 1234| 12.04| 12.04| 12.04|
| 123| 12.3| 12.3| 12.3|
| 12| 12.0| 12.0| 12.0|
Попробуйте 1 заменить конечные нули также в целых числах, попробуйте 2 было взятых из другого решения для замены конечных нулей в одном поплавке. Оба являются неудовлетворительными, так как желаемый результат должен быть:
| 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 |
Почему это не является дубликатом вопрос
- Python регулярное выражение двигатель немного отличается от других языков двигателей, поэтому решения, приведенные на других языках не применяются автоматически
- Заменяющие нули должны быть заменены, не разделены
- Речь идет о глобальной замене многих случаев в многострочной строке , А не только один occurrency
что ожидаемый выход? – vks
@vks Это в вопросе. – mmj
@mmj какое правило превращается 12 в 12.0, но сохраняет 12345, как есть? – yurib