第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python Regex 從內(nèi)部匹配開始

Python Regex 從內(nèi)部匹配開始

慕尼黑的夜晚無繁華 2023-02-15 15:18:23
我正在使用 Python 開發(fā)一個正則表達式,它將數(shù)學表達式轉換為 Sympy 語言pow(x,y)中的冪格式。例如,它接受2^3并返回pow(2,3).我目前的模式是:# patternpattern = re.compile(r'(.+?)\^(.*)')為了找到嵌套表達式的數(shù)學運算,我使用 for 循環(huán)來計算 ^(hat) 的數(shù)量,然后使用 re.sub 生成冪格式:# length of the for loopnum_hat = len(re.findall(r'\^', exp))# for nested powfor i in range(num_hat):    exp = re.sub(pattern, r'pow(\1,\2)', exp)return exp此方法不適用于嵌套的 ^ 表達式,例如a^b^c^dorsin(x^2)^3因為最后括號的位置不正確。因為a^b^c^d它返回pow(pow(pow(a,b,c,d)))因為sin(x^2)^3它返回pow(pow(sin(x,2),3))有什么辦法可以克服這個問題嗎?我嘗試了負面前瞻,但它仍然無法正常工作
查看完整描述

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。


查看完整回答
反對 回復 2023-02-15
?
守候你守候我

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) )不是你想要的。


查看完整回答
反對 回復 2023-02-15
?
繁花如伊

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)^并替換最后一個匹配項(存在$)


查看完整回答
反對 回復 2023-02-15
  • 3 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號