实现能计算类似1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序用正则表达式

 1 # 实现能计算类似
 2 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
 3 # 等类似公式的计算器程序
 4 ss = ''
 5 for i in s:
 6     if i != ' ':
 7         ss += i
 8 import re
 9 ret = re.split('[()/]',re.search('\(\-?\d+[/]\d+\)',ss).group())
10 for i in range(ret.count('')):ret.remove('')
11 fin = float(ret[0])/float(ret[1]) #(-40/5)
12 ret1 = re.split('[(*\-+/]',re.search('[*/]\(\d+[\-]\d+[*]\d+[/]\d+',ss).group())
13 for i in range(ret1.count('')):ret1.remove('')
14 fin1 = float(ret1[0])-float(ret1[1])*float(ret1[2])/float(ret1[3])#*(9-2*5/3
15 ret2 = re.split('[+*/]',re.search('[+]\d+[/]\d+[*]\d+[/]\d+[*]\d+',ss).group())
16 for i in range(ret2.count('')):ret2.remove('')
17 fin2 = float(ret2[0])/float(ret2[1])*float(ret2[2])/float(ret2[3])*float(ret2[4]) #+7/3*99/4*2998
18 ret3 = re.split('[+*/)]',re.search('[+]\d+[*]\d+[/]\d+\)',ss).group())
19 for i in range(ret3.count('')):ret3.remove('')
20 fin3 = float(ret3[0])*float(ret3[1])/float(ret3[2]) #+10*568/14)
21 ret4 = re.split('[(\-]',re.search('\(\d+[\-]\(?[\-]?\d+\)?',ss).group())
22 for i in range(ret4.count('')):ret4.remove('')
23 fin4 = float(ret4[0])-float(ret4[1]) #(60-30
24 ret5 = re.split('[()*]',re.search('\([\-]?\d+[*]\(?[\-]?\d+\)?\)',ss).group())
25 for i in range(ret5.count('')):ret5.remove('')
26 fin5 = float(ret5[0])*float(ret5[1]) #(-4*3)
27 ret6 = re.split('[/()\-*]',re.search('[/]\(\(?[\-]?\d+[\-]\(?[\-]?\d+\)?[*]\(?[\-]?\d+\)?\)\)',ss).group())
28 for i in range(ret6.count('')):ret6.remove('')
29 fin6 = float(ret6[0])-float(ret6[1])*float(ret6[2]) #/(16-3*2))
30 ret7 = re.match('\(?[\-]?\d+\)?',ss).group()
31 fin7 = float(ret7) #1
32 ret8 = re.split('[\-*(]',re.search('\(?[\-]?\d+\)?[*]\(\(',ss).group())
33 for i in range(ret8.count('')):ret8.remove('')
34 fin8 = float(ret8[0])
35 fin9 = fin7-fin8*(fin4+fin*(fin1+fin2+fin3))-fin5/fin6
36 print(fin9)
37 print(eval('1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'))
代码

 

# 实现能计算类似
s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
# s = '1+1+1+'
# 等类似公式的计算器程序
import re
def cpu_md(ss):#计算乘除
    while True:
        try:
            ret = re.search('\d+\.?\d*[*/][\-]?\d+\.?\d*', ss).group()
            if ret:
                if '*' in ret:
                    ret1 = re.split('[*]', ret)
                    ret2 = float(ret1[0]) * float(ret1[1])
                    ss = re.sub('\d+\.?\d*[*/][\-]?\d+\.?\d*', str(ret2), ss, 1)
                if '/' in ret:
                    ret1 = re.split('[/]', ret)
                    ret2 = float(ret1[0]) / float(ret1[1])
                    ss = re.sub('\d+\.?\d*[*/][\-]?\d+\.?\d*', str(ret2), ss, 1)
            else:
                return ss
        except:
            return ss
def cpu_mdi(ss):#计算括号内加减eg:(1+2-4)
    while True:
        try:
            ret = re.search('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', ss).group()
            if '+' in ret:
                ret1 = re.split('[+]', ret)
                ret2 = float(ret1[0]) + float(ret1[1])
                ss = re.sub('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', str(ret2), ss, 1)
            elif '-' in ret:
                if not ret.startswith('-'):
                    ret1 = re.split('[\-]', ret)
                    for i in range(ret1.count('')):ret1.remove('')
                    ret2 = float(ret1[0]) - float(ret1[1])
                    ss = re.sub('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', str(ret2), ss, 1)
            else:
                return ss
        except:
            return ss
def d90(ss):#去括号eg:(-10)===-10
    while True:
        try:
            ret = re.search('\([\-]?\d+\.?\d+\)',ss).group()
            ret1 = re.split('[()]',ret)
            ret1.remove('')
            ret1.remove('')
            ss = re.sub('\([\-]?\d+\.?\d+\)',ret1[0],ss,1)
        except:
            return ss
def jj(ss):
    while True:
        if '+-' in ss:ss = ss.replace('+-','-')
        elif '-+' in ss:ss = ss.replace('-+','-')
        elif '++' in ss:ss = ss.replace('++','+')
        elif '--' in ss:ss = ss.replace('--','+')
        else:return ss
i = 0
# s = input('>>>').strip()
s = s.replace(' ','')
while i < 5:
    s = cpu_md(s)
    s = cpu_mdi(s)
    s = d90(s)
    s = jj(s)
    i += 1
# s = '2+2'

print(s)
View Code

 

posted @ 2017-08-08 16:40  风火林山  阅读(204)  评论(0编辑  收藏  举报