1 ImportRe2 3 4 defCalc (Formula):5Formula = Re.sub (' ',"', Formula)6Formula_ret =07Match_brackets = Re.search (r'\([^()]+\)', Formula)8 ifmatch_brackets:9Calc_result = Calc (Match_brackets.group (). Strip ("(,)"))TenFormula =Formula.replace (Match_brackets.group (), str (calc_result)) One returnCalc (Formula) A Else: -Formula = Formula.replace ('--','+'). Replace ('++','+'). Replace ('-+','-'). Replace ('+-','-') - whileRe.findall (R"[*/]", formula): theGet_formula = Re.search (r"[. \d]+[*/]+[-]? [. \d]+", Formula) - ifGet_formula: -Get_formula_str =Get_formula.group () - ifGet_formula_str.count ("*"): +Formula_list = Get_formula_str.split ("*") -ret = float (formula_list[0]) * FLOAT (formula_list[1]) + Else: AFormula_list = Get_formula_str.split ("/") atret = float (formula_list[0])/float (formula_list[1]) -Formula = Formula.replace (GET_FORMULA_STR, str (ret)). Replace ('--','+'). Replace ('++','+') -Formula = Re.findall (r'[-]? [. \d]+', Formula) - forNuminchformula: -Formula_ret + =float (num) - returnFormula_ret in #calc_str = input (' >>> ') -Calc_str ='1-2* ((60-30+ ( -40---5) * (9-2*5/3+7/3*99/4*2998+ 10*568/14))-( -4*3)/(16-3*2))' to Print(eval (calc_str)) +Formula_result =Calc (calc_str) - Print(Formula_result)
With basic verification
1 ImportRe2Invalid_str_re = Re.compile (r'[*/]{3,}| [%] {2,}|\ ([*/%]+\d+|^[*/%]+\d+|\ (+\) +|\d+[-+*/%]+$|\) +\ (+|\d+[-+*/%]+\) |\d+\ (+')3 4 5 defDecorate (func):6 defWrapper (Formula):7Formula = Re.sub (' ',"', Formula)8Valid_str = Re.findall (r'[-+*/%.() \d]+', Formula)9Invalid_str =Invalid_str_re.findall (Formula)Ten if(Valid_str andLen (valid_str[0])! = Len (Formula))orInvalid_str: One returnFalse A returnfunc (Formula) - returnwrapper - the - @decorate - defCalc (Formula): -Formula = Re.sub (' ',"', Formula) +Formula_ret =0 -Match_brackets = Re.search (r'\([^()]+\)', Formula) + ifmatch_brackets: ACalc_result = Calc (Match_brackets.group (). Strip ("(,)")) atFormula =Formula.replace (Match_brackets.group (), str (calc_result)) - returnCalc (Formula) - Else: -Formula = Formula.replace ('--','+'). Replace ('++','+'). Replace ('-+','-'). Replace ('+-','-') - whileRe.findall (R"[*/]", formula): -Get_formula = Re.search (r"[. \d]+[*/]+[-]? [. \d]+", Formula) in ifGet_formula: -Get_formula_str =Get_formula.group () to ifGet_formula_str.count ("*"): +Formula_list = Get_formula_str.split ("*") -ret = float (formula_list[0]) * FLOAT (formula_list[1]) the Else: *Formula_list = Get_formula_str.split ("/") $ret = float (formula_list[0])/float (formula_list[1])Panax NotoginsengFormula = Formula.replace (GET_FORMULA_STR, str (ret)). Replace ('--','+'). Replace ('++','+') -Formula = Re.findall (r'[-]? [. \d]+', Formula) the forNuminchformula: +Formula_ret + =float (num) A returnFormula_ret the #calc_str = input (' >>> ') +Calc_str ='1-2* ((60-30+ ( -40---5) * (9-2*5/3+7/3*99/4*2998+ 10*568/14))-( -4*3)/(16-3*2))' -Formula_result =Calc (calc_str) $ Print(Formula_result)
Python implements the simplest calculator function source code