3 回答

TA貢獻1816條經(jīng)驗 獲得超4個贊
沒有很好的說法,但你有一個XY 問題的極端情況。您顯然想要的是將一些數(shù)學表達式轉換為 SymPy。編寫自己的正則表達式似乎是一種非常乏味、容易出錯并且可能不可能實現(xiàn)的方法。
作為一個龐大的符號庫,SymPy 帶有一個完整的解析子模塊,它允許您在所有細節(jié)上調(diào)整解析表達式,特別是convert_xor
控制角色發(fā)生的事情^
。但是,您似乎不需要做任何事情,因為^
默認情況下轉換為指數(shù)。因此,您可以簡單地執(zhí)行以下操作:
from sympy import sympify print( sympy.sympify("a^b^c^d") ) # a**(b**(c**d)) print( sympy.sympify("sin(x^2)^3") ) # sin(x**2)**3
請注意,這**
相當于pow
,所以我不確定您為什么堅持使用后者。如果你需要一個可以在另一種編程語言中工作的輸出,這就是打印模塊的用途,你自己改變它也相對容易。可以幫助您獲得所需表格的另一件事是sympy.srepr
。

TA貢獻1802條經(jīng)驗 獲得超10個贊
你為什么不為此使用遞歸?它可能不是最好的,但如果嵌套的權力不是很多,它將適用于您的用例,
一個小演示,
import re
#Your approach
def func(exp):
# pattern
pattern = re.compile(r'(.+?)\^(.*)')
# length of the for loop
num_hat = len(re.findall(r'\^', exp))
# for nested pow
for i in range(num_hat): # num_hat-1 since we created the first match already
exp = re.sub(pattern, r'pow(\1,\2)', exp)
return exp
#With recursion
def refined_func(exp):
# pattern
pattern = '(.+?)\^(.*)'
# length of the for loop
num_hat = len(re.findall(r'\^', exp))
#base condition
if num_hat == 1:
search = re.search(pattern, exp)
group1 = search.group(1)
group2 = search.group(2)
exp = "pow("+group1+", "+group2+")"
return exp
# for nested pow
for i in range(num_hat): # num_hat-1 since we created the first match already
search = re.search(pattern, exp)
if not search: # the point where there are no hats in the exp
break
group1 = search.group(1)
group2 = search.group(2)
exp = "pow("+group1+", "+refined_func(group2)+")"
return exp
if __name__=='__main__':
print(func("a^b^c^d"))
print("###############")
print(refined_func("a^b^c^d"))
上面程序的輸出是,
pow(pow(pow(a,b,c,d)))
###############
pow(a, pow(b, pow(c, d)))
您的方法存在問題:
最初你從以下表達式開始,
a^b^c^d
a使用您定義的正則表達式,兩部分由上述表達式 -> part1:和 part2:組成b^c^d。有了這兩個,您就可以生成pow(a,b^c^d). 所以你使用的下一個表達式是,
pow(a,b^c^d)
現(xiàn)在在這種情況下,您的正則表達式將使 part1 成為pow(a,b,而 part2 成為c^d)。因為,用于從 part1 和 part2 構建信息的 pow 語句就像pow(part1, part2),你最終得到的pow( pow(a,b , c^d) )不是你想要的。

TA貢獻2012條經(jīng)驗 獲得超12個贊
我嘗試了你的例子,但我仍然建議你找到一個數(shù)學解析器(根據(jù)我的評論),因為這個正則表達式非常復雜。
import re
pattern = re.compile(r"(\w+(\(.+\))?)\^(\w+(\(.+\))?)([^^]*)$")
def convert(string):
while "^" in string:
string = pattern.sub(r"pow(\1, \3)\5", string, 1)
return string
print(convert("a^b^c^d")) # pow(a, pow(b, pow(c, d)))
print(convert("sin(x^2)^3")) # pow(sin(pow(x, 2)), 3)
解釋:在有 a 的情況下循環(huán)^并替換最后一個匹配項(存在$)
添加回答
舉報