我有一串数学函数,如下所示:
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']
并且似乎也将小数分开。 谢谢!
答案 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
如果您计划使用该特殊字符命名变量,请将它们添加到括号中。一旦你获得了所有的数字,你应该能够将它们转换为浮点数,并且可以毫不费力地添加它们。