Python用正则实现计算字符串算式
-
在Python里面其实有一种特别方便实用的直接计算字符串算式的方法
-
那就是eval()
s = '1+2*(6/2-9+3*(3*9-9))' print(eval(s)) #97.0
-
好了,我现在就是想用正则写一个类似这样功能的东西
-
第一步,我们拿到一个算式,例如’1+2*(6/2-9+3*(3*9-9))’
-
按照我们小学学的知识我们应该知道我们应该从最内层括号里面的算式开始计算
-
那我们怎么拿到最内层括号里面的算式呢?我们可以用正则啊
import re pattern = re.compile(r'\([^(^)]*?\)') s = '1+2*(6/2-9+3*(3*9-9))+(6-3)' ret = pattern.findall(s) print(ret) #['(3*9-9)','(6-3)']
-
好了,我们现在就拿到了最内层括号以及里面的算式了,第一步完成
-
-
第二步,我们要把拿到的内容给它去掉括号
-
因为我们拿到的最内层的括号可能不止一个,所以我们用一个新的列表来存一下去掉括号里面的算式
ret2 = [] pattern2 = re.compile(r'\((?P<tag>.*?)\)') for i in range(len(ret)): ret3 = pattern2.search(ret[i]) ret2.append(ret3.group('tag')) print(ret2) #['3*9-9', '6-3']
-
其实到这里我们几乎已经成功一大半了
-
-
第三步,我们就要来安排我们拿到的最内层括号的算式了
-
这里只展示逻辑,我就只拿’3*9-9’(ret2[1])来说了
-
我们还是得根据算术逻辑来,先乘除,后加减
-
乘除
def mul_div(s): if '*' in s: s = s.split('*') return float(s[0]) * float(s[1]) elif '/' in s: s = s.split('/') return float(s[0]) / float(s[1]) while True: pattern3 = re.compile(r'[-+*/]?(?P<tag>-?\d+(\.\d+)?[*/]-?\d+(\.\d+)?)') ret3 = pattern3.search(ret2[1]) try: ret4 = ret3.group
-