# -*- coding: UTF-8 -*- # Author: hanly import re s = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' #去掉括号以后变换运算符号 def sign_change(): global user_input user_input = user_input.replace('+-','-') user_input = user_input.replace('-+', '-') user_input = user_input.replace('--', '+') user_input = user_input.replace('++', '+') user_input = user_input.replace('+/', '/') user_input = user_input.replace('/+', '/') user_input = user_input.replace('*+', '/') user_input = user_input.replace('+*', '/') #*-替换为*存在问题 user_input = user_input.replace('*-', '*') #匹配最内部的括号 def search_func(user_input): user_search = re.search(r'\([^()]+\)',user_input) if user_search: user_search = user_search.group() # user_search = user_search[1:-1] return user_search #乘除法运算 def multipli(inner_con): while re.search(r'\*|\/',inner_con): res_multi = re.search("\d+\.?\d*[\/\*]{1}\d+\.?\d*",inner_con) if res_multi: multi_res = res_multi.group() if '*' in multi_res: numbers = multi_res.split('*') res = int(numbers[0])*int(numbers[1]) else: numbers = multi_res.split('/') res = int(numbers[0]) / int(numbers[1]) inner_con = inner_con.replace(multi_res, str(res)) print inner_con if re.match(r'^\-', inner_con[1:-1]): tem = 0 else: tem = 1 if tem == 1 and re.search(r'\+|\-',inner_con): return plus(inner_con[1:-1]) elif '(' in inner_con: return inner_con[1:-1] else: return inner_con #加减法运算 def plus(user_input): while re.search(r'\+|\-',user_input): re_plus = re.search(r'.?\d+[\-\+]{1}\.?\d+', user_input) if re_plus: re_plus = re_plus.group() if '+' in re_plus: re_list = re_plus.split('+') if re.match(r'^\-',re_plus): re_list = -int(re_list[0])+int(re_list[1]) else: re_list = int(re_list[0])+int(re_list[1]) else: re_list = re_plus.split('-') sub_list = re.findall(r'\-',re_plus) if len(sub_list) == 2: re_list = -int(re_list[1]) - int(re_list[2]) elif re.match(r'^\-',re_plus): re_list = -int(re_list[0])+int(re_list[1]) else: re_list = int(re_list[0]) - int(re_list[1]) user_input = user_input.replace(re_plus,str(re_list)) else: return user_input return user_input if __name__ == '__main__': global user_input #user_input = raw_input('请输入计算公式:') user_input = s while search_func(user_input): # 查找公式最内部的括号 inner_con = search_func(user_input) if inner_con: sign_change() print inner_con mul_res = multipli(inner_con) user_input = user_input.replace(inner_con,mul_res) print user_input sign_change() inner_con = search_func(user_input) user_input = multipli(user_input) result = plus(user_input) print '结果为:',result
代码中运算符变换处待修改
浙公网安备 33010602011771号