利用正则表达式来实现求一个数学表达式的和

Posted Eric9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用正则表达式来实现求一个数学表达式的和相关的知识,希望对你有一定的参考价值。

1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
求上述表达式的结果
分析:对于上述表达式,涉及的括号及运算符较多,需使用正则表达式来匹配相应的字符,将字符进行分开计算
1、提取最里层括号里面的内容
2、计算最里层括号内的乘除运算,并将结果替换到原表达式
3、循环执行前两步的结果
 1 import re
 2 # formula = "1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
 3 #  #含义:匹配括号,但是不匹配成对的括号,按正则表达式进行分割,最大分割次数为1次,取出最内层的括号内的一组元素
 4 # val = re.split(‘\(([^()]+)\)‘,formula,1)
 5 # before,center,last=val
 6 # print(val)
 7 # #将取出的内容进行运算
 8 # if "*" in center:
 9 #     new_center=re.split("\*",center)
10 #     sub_res=float(new_center[0])*float(new_center[1])
11 #     print("单步计算结果为:",sub_res)
12 #
13 # elif "/" in center:
14 #     new_center=re.split("/",center)
15 #     sub_res=float(new_center[0])/float(new_center[1])
16 #     print("单步计算结果为:",sub_res)
17 #
18 # formula=before+str(sub_res)+last
19 # print(formula)
20 # val1 = re.split(‘\(([^()]+)\)‘,formula,1)
21 # print(val1)
22 # val2= re.split(‘(\d+\.?\d*[*/][\-]?\d+\.?\d*)‘,formula,1)
23 # print("val2:",val2)
24 # before1,center1,last1=val2
25 #
26 # if "*" in center1:
27 #     new_center=re.split("\*",center1)
28 #     print("111:",new_center)
29 #     sub_res=float(new_center[0])*float(new_center[1])
30 #     print("单步计算结果为:",sub_res)
31 #
32 # elif "/" in center1:
33 #     new_center=re.split("/",center1)
34 #     sub_res=float(new_center[0])/float(new_center[1])
35 #     print("单步计算结果为:",sub_res)
36 
37 
38 
39 
40 
41 #计算,首先利用正则表达式,匹配最内层括号,并取出最内层括号内的元素,然后进行最内层括号内运算
42 def calc(formula):
43     while True:
44         #取最里层括号里面的内容,进行运算
45         val =re.split(\(([^()]+)\),formula,1)
46         if len(val)==3:
47             before,center,last=val
48             new_center=mul_div(center)
49             formula=before+str(new_center)+last
50         else:
51             return mul_div(formula)
52 
53 def mul_div(formula):
54     while True:
55         #取优先级高的,进行拆分计算
56         val1=re.split((\d+\.?\d*[*/][\-]?\d+\.?\d*),formula,1)
57         if len(val1)==3:
58             bef,cent,la=val1
59             if "*" in cent:
60                 new_cent=re.split("\*",cent)
61                 sub_res=float(new_cent[0])*float(new_cent[1])
62                 formula=bef+str(sub_res)+la
63             elif "/" in cent:
64                 new_cent=re.split("/",cent)
65                 sub_res=float(new_cent[0])*float(new_cent[1])
66                 formula=bef+str(sub_res)+la
67         else:
68             return final(formula)
69 
70 def final(formula):
71     #由前面的分析结果可以看出,拆分时运算符被拆分,但计算结果有时含有运算符,故需进行替换
72     formula = formula.replace(++,+).replace(+-,-).replace(-+,-).replace(--,+)
73     num = re.findall([+\-]?\d+\.?\d*,formula)
74     total = 0
75     for i in num:
76         total += float(i)
77     return total
78 
79 
80 
81 if __name__ == __main__:
82     formula = "1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
83     result=calc(formula)
84     print(result)

 

以上是关于利用正则表达式来实现求一个数学表达式的和的主要内容,如果未能解决你的问题,请参考以下文章

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

使用正则表达式拆分数学表达式

利用正则表达式实现python强口令检测

求一个正则表达式只能输入数字小数点后两位和

求一个正则表达式:校验url和磁盘路径。

c# 正则表达式提取()中的值