2015-06-26 2 views
1

Я ищу способ, чтобы удалить все ненужные нули из всех поплавков в строке. Итак, я бы повернул 1.0*2.40*abc+1 до 1*2.4*abc+1. У меня было два пути, чтобы сделать это сейчас, одна исправляет проблему другой в:Python: Удалить 0s из float в строке

re.sub(r'(?<=\d)\.?0+\b', "", my_string) 
#Problem: It shorts 10 to 1 (for example) 

re.sub(r'(?<=\d)\.0+\b', "", my_string) 
#Problem: It doesn't short 2.40 (for example) 

Если вы не знаете, о чем я говорю, не стесняйтесь спрашивать.

+0

Вы хотите сократить отдельные поплавки или целые выражения типа '1.0 * 2.40 * abc + 1'? – Rishav

+0

Добро пожаловать в SO! Поскольку вы новичок, вы можете проверить это [ссылка] (http://meta.stackexchange.com/a/5235/187716). – fferri

ответ

2

Вы можете сделать регулярную замену выражений, используя функцию замещения:

repl=lambda x: x.group(1) + (x.group(2).rstrip('0').rstrip('.')) 
re.sub('(?<!\d)(\d+)(\.\d*)(?!\d)',repl,string) 

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

>>> for testcase in ('1','1.','1.0','1.01','1.01000','0.00','0.100','1.0*2.40*abc+1','100.000','100.0100','20.020','200.'): 
...  print('{:16s} --> {}'.format(testcase, re.sub('(?<!\d)(\d+)(\.\d*)(?!\d)',repl,testcase))) 
... 
1    --> 1 
1.    --> 1 
1.0    --> 1 
1.01    --> 1.01 
1.01000   --> 1.01 
0.00    --> 0 
0.100   --> 0.1 
1.0*2.40*abc+1 --> 1*2.4*abc+1 
100.000   --> 100 
100.0100   --> 100.01 
20.020   --> 20.02 
200.    --> 200 
+0

Это изменилось как - ничего? – Unknown

+0

Какой? Я не нахожу рабочий. Обновите свой почтовый ящик – Unknown

+0

Этот файл не работает на '.10000000' (обратите внимание на отсутствие цифры до десятичной точки). –

-2

Ну, если вы не хотите использовать библиотеку re, вы можете просто сделать это. Это старый трюк.

string = <your_string_with_zeroes> 
string_new = [] 
for i in list(string): 
    if i!='0': 
     string_new.append(i) 

print(''.join(string_new)) 
+1

Не удалял бы все 0s из строки, даже такие полезные, как - 10? –

+0

На самом деле он не удалял * any *, потому что '0! = '0''. – jonrsharpe

+0

@jonrsharpe >> Мы говорим о струнах. Итак, «0» == «0». Int не имеет значения ^^ – Unknown

1

Вы используете шаблон вид-за (`(? < = ...) конструкт). Это не сработает. Что вам нужно сделать, так это искать «несущественные» нули. Два нуля в 100. Последние два нуля в 100.0100 не имеют значения. Некоторые вещи, чтобы следить за:

  • 100 -> 100
    Это должно остаться нетронутым (как, конечно, должен '0').

  • 100.0000 -> 100
    Здесь хотите удалить конечные нули и десятичную точку.

  • 100.0100 -> 100.01 Здесь вы хотите сохранить десятичную точку и все дробные цифры до «1».

  • .1000 -> .1
    Здесь нет указателей перед десятичной точкой.


A (не совсем) простое регулярное выражение будет делать трюк:

re.sub('(\d\.|\.\d*[1-9])0+(?!\d)',r'\1',string) 


Демо: https://ideone.com/9MVIlC

+1

Это почти работает. Но если я ввожу целое число, это заставляет задуматься. (200> 200.) И 20.020 => 20.200000000 – Unknown

+0

он также терпит неудачу с одним из перечисленных вами случаев: 're.sub (" (\ d \. \ \. \ D * [1-9]) 0+ ", r '\ 1', '100.0100') '--->' '100.100'' – fferri

+0

@mescalinum - Исправлено. Мне нужно было смотреть в конце выражения с нулевой длиной вперед. –

0

Здесь (ИМО), самый простой способ сделать это, избегая сложных регулярных выражений. Предполагается, что все ваши выражения ограничены символами +, -, * или /.

def strip(s): 
    if s.find('.') != -1: 
     s= s.rstrip('0') 
     if s[-1] == '.': s = s[:-1] 
     return s 
    else: 
     return s 

s = raw_input() + '+' 
accum = '' 
out = '' 
for i in range(len(s)): 
    if s[i] in "+-/*": 
     out = out + strip(accum) + s[i] 
     accum = '' 
    else: 
     accum = accum + s[i] 
print out[:-1] 
1

Откуда взялась строка? Возможно, он лучше генерирует его в формате, который вы хотите с самого начала, а не пытаетесь разобрать его потом. Например ... и не полное решение, так как я не знаю, какой диапазон значений у вас будет. Ознакомьтесь с языком мини-форматирования Python на сайте Python для вашей версии python.Числа и т. Д. В разделе формата, очевидно, могут быть заменены на переменные

>>> "{:3.0f}*{:3.1f}*{}+{:<3.0F}".format(1.000,2.40000,"abc",1e0) 
' 1*2.4*abc+1 
Смежные вопросы