我们正在研究一个大型数学项目,其中包含许多由Wolfram Mathematica制作的长方程和导数。我们有1000多个非常长的方程式。
主程序用Java编写,Mathematica仅用于生成方程式。我们的目标是将等式的“ Mathematica”形式转换为“ Java”形式。然后,我们可以将生成的代码直接复制/粘贴到“ Java”代码中。
例如,我们有Mathematica形式的简短方程:
Sqrt[((Cos[R]*X1 - X2)^2 + (Sin[R]*Y1 - Y2)^2)/S^2]/S
我们希望以Java形式提供它,所以这是预期的结果:
Math.sqrt((Math.pow(Math.cos(R) * X1 - X2, 2) + Math.pow(Math.sin(R) * Y1 - Y2, 2)) / Math.pow(S, 2)) / S
这是简短的python脚本,它管理一些功能:
E = "Sqrt[((Cos[R]*X1 - X2)^2 + (Sin[R]*Y1 - Y2)^2)/S^2]/S"
E = E.replace("[", "(") # Replaces Square brackets with normal brackets
E = E.replace("]", ")") # Replaces Square brackets with normal brackets
E = E.replace("*", " * ") # Add some spaces for easier reading
E = E.replace("/", " / ") # Add some spaces for easier reading
E = E.replace("Cos", "Math.cos") # Change "Mathematica" cos to "Java" cos
E = E.replace("Sin", "Math.sin") # Change "Mathematica" sin to "Java" sin
E = E.replace("Sqrt", "Math.sqrt") # Change "Mathematica" SQRT to "Java" SQRT
# Converting Power function is missing here... This is a must :)
print(E)
上面的代码产生:
Math.sqrt(((Math.cos(R) * X1 - X2)^2 + (Math.sin(R) * Y1 - Y2)^2) / S^2) / S
问题是我们找不到幂函数的任何解决方案。我们想使用python regex,但找不到任何合适的解决方案。问题是幂函数必须将所有内容都放在方括号内,例如:
(Math.cos(R) * X1 - X2)^2 >>>> Math.pow(Math.cos(R) * X1 - X2, 2)
我希望有人有一个快速而理想的解决方案。否则,我将需要一些时间并编写一个冗长且“肮脏”的脚本,它将解决此问题。
感谢您的帮助:)
答案 0 :(得分:1)
您的正则表达式搜索可能是这样的:
import re
E = "(Math.cos(R) * X1 - X2)^2"
regex = re.compile(r'\((.*)\)\^(\d)')
match = regex.match(E)
new_E = "Math.pow(%s, %s)" % (match.group(1), match.group(2))
print(new_E) # Math.pow(Math.cos(R) * X1 - X2, 2)
它的工作方式是搜索括号内的所有内容,然后搜索^n
,n
是从0到9的数字。
我希望您可以根据需要对其进行调整以使其通用化。
答案 1 :(得分:0)
我尝试使用mathematica的fullform []函数将a ^ b转换为Power [a,b]。然后我使用查找和替换将Power [a,b]更改为任意函数,例如PowerJ [a,b]。然后,我可以改回输入stlye,以将公式返回到具有“ *,+”等的形式。然后,我便可以使用上面的代码将PowerJ [a,b]更改为Math.pow [a,b] ]。