Использование регулярных выражений в Python для поиска чисел с плавающей точкой и замены их с уменьшенной точностью чисел в строке? - PullRequest
0 голосов
/ 13 декабря 2018

Извиняюсь, если на этот вопрос уже был дан ответ - я попытался найти его, но, возможно, мои условия поиска (такие же, как у моего названия) были неверными.

Давайте предположим, что у меня есть строка, подобная этой, которую я не вижуя не могу контролировать:

astr = "A 5.02654824574 (14.710000000000008, -19.989999999999995, -0.8) <-> s[10]: A 5.02654824574 (-29.11999999999999, 52.78, -0.8)"

Я хотел бы обработать эту строку, чтобы плавающие в ней отображались с произвольным количеством точности с плавающей точкой - скажем, 3 десятичных знака.Так как это будет работать на уровне строки, я не ожидал бы, что процесс будет учитывать правильное округление - просто для удаления символов строки десятичной запятой.

Я знаю, что мог бы сделать, согласно Python: извлечение нескольких чисел с плавающей точкой из строки :

import re
p = re.compile(r'\d+\.\d+')
for i in p.findall(astr): print i

... которая печатает:

5.02654824574
14.710000000000008
19.989999999999995
0.8
5.02654824574
29.11999999999999
52.78
0.8

.... однако я теряюсь прикакое регулярное выражение захватывает, что мне нужно сделать при поиске и замене, например, для n_float_precision_decimals = 4, - я получу эту строку в качестве вывода (с указанной выше строкой в ​​качестве ввода):

"A 5.0265 (14.7100, -19.9899, -0.8) <-> s[10]: A 5.0265 (-29.1199, 52.78, -0.8)"

Итакв основном, регулярное выражение будет учитывать, что если уже есть меньшее количество десятичных знаков, оно вообще не будет усекать десятичные дроби.

Возможно ли это сделать в одной операции re.sub безвам приходится писать явные циклы for, как описано выше, и вручную создавать строку вывода?

1 Ответ

0 голосов
/ 13 декабря 2018

Понял - благодаря Уменьшите точность с плавающей точкой, используя RegExp в swift (который появился в предложениях SO только после того, как я закончил вводить весь вопрос (в течение которого все, что я получил, было неуместными результатами для этого конкретноговопрос) :)):

>>> pat=re.compile(r'(\d+\.\d{2})\d+')
>>> pat.sub(r'\1', astr)
'A 5.02 (14.71, -19.98, -0.8) <-> s[10]: A 5.02 (-29.11, 52.78, -0.8)'

... или:

>>> nfloatprec=4
>>> pat=re.compile(r'(\d+\.\d{'+str(nfloatprec)+'})\d+')
>>> pat.sub(r'\1', astr)
'A 5.0265 (14.7100, -19.9899, -0.8) <-> s[10]: A 5.0265 (-29.1199, 52.78, -0.8)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...