将整数转换为字符串中的小数

时间:2016-03-09 03:11:34

标签: python string integer

我有一串数学函数,如下所示:

add(multiply(1, 4461.2419), multiply(subtract(X1, 5), 475.5))

我想只提取整数并将它们转换为小数,然后将它们重新连接到字符串。例如,我希望输出看起来像:

add(multiply(1.0, 4461.2419), multiply(subtract(X1, 5.0), 475.5))

我该怎么做呢?另外,请注意'X1'是一个变量名,所以我不希望变量名中的1转换为float。

到目前为止,我已经尝试过类似的东西来识别整数:

s = "add(multiply(1, 4461.2419), multiply(subtract(X1, 5), 475.5))"
print(re.findall("[-+]?\d+", s))

但它给出了这个结果:

['1', '4461', '2419', '1', '5', '475', '5']

并且似乎也将小数分开。 谢谢!

3 个答案:

答案 0 :(得分:1)

str1= 'add(multiply(1, 4461.2419), multiply(subtract(X1, 5), 475.5))'

def replf(matchobj):
     a= matchobj.group(0)
     float= re.findall('\d+',a)[0]+'.0'
     return re.sub('\d+', float,a)

print re.sub('[\(\,\s](\d+)[\)\,\s]' ,replf,str1)   #no decimals allowed

输出:

add(multiply(1.0, 4461.2419), multiply(subtract(X1, 5.0), 475.5))

答案 1 :(得分:0)

不太好看,但我已经将正则表达式用于使用。可能有一个更好的答案

import re

fnStr = 'add(multiply(1, 4461.2419), multiply(subtract(X1, 5), 475.5))'

# initializing the string to store the final value
finalStr = ''

# looks like it is always going to be that integers will end up as parameters to function calls, so splitting them using commas and looping the parts over
for i in fnStr.split(', '):
    # following is for ignoring the floats and also the variables which are of form X1
    if '.' in i and not re.search('\w\d',i):
        finalStr += i+', '
    #This is where we detect the integer and convert in to float and replace the string
    else:
        finalStr += re.sub('\d',str(float(re.search('\d',i).group(0))), i) +', '

# finally stripping the last comma and space added as a sideeffect of the previous loop
print finalStr.rstrip(', ')

编辑:如果您认为变量可以是任何名称,例如re.search('\w+\d+',i)

,您可能希望将检测变量的逻辑更改为XX11

答案 2 :(得分:-1)

这个正则表达式结合你在re.findall()上面使用的函数,应该给你所有的数字:

[^a-zA-Z_0-9.]([\d.]+)

它从变量名中排除数字,如:

aa123 
as_123 
AS123_

和所有其他类似的组合。非常奇怪的变量名称可能会导致一些故障,如:

as%1234
fds$121
asfas#231

如果您计划使用该特殊字符命名变量,请将它们添加到括号中。一旦你获得了所有的数字,你应该能够将它们转换为浮点数,并且可以毫不费力地添加它们。