python3 regex exercise

来源:互联网 发布:肖像漫画软件 编辑:程序博客网 时间:2024/06/08 00:18
#!/usr/bin/env python3## regex exercise# parses the formula and takes out the pattern like '(a + b)' one by one from most inner level to outer level# then calculates them and replace with theirs values, until the whole formula parsed down to single 'a + b'import re# formula = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'formula = '0.0102031 - (2) / 2 * ( (60-30 +( -40 /5) * (9.0123-2*5/3 + 7 /3*99/4*2998 +10 * 568/144.4440044 )) - (-4*3)/ (16-3*2) )'num = '(\d+\.\d+|\d+)' # float OR integerops = '[\+|\-|\*|\/]'plus_minus = '[\+|\-]'times_divide = '[\*|\/]'the_one = '\(\s*(\-?%s+\s*%s+\s*)*%s+\s*\)' % (num, ops, num) # (a + b -c) OR (-c)the_pm = '\s*(\-?%s+\s*%s+\s*)+%s+\s*' % (num, plus_minus, num) # equation with * or /the_td = '\s*(\-?%s+\s*%s+\s*)+%s+\s*' % (num, times_divide, num) # equation with + or -# do * and / calculationdef do_times_divide(formula):  while True:    result = re.search(the_td, formula)    if result:      group = result.group()      r = eval(group)      print('times_divide:', formula, group, r, sep=' | ')      formula = formula.replace(group, str(r))      # print(formula)    else:      break  formula = formula.replace('(', '').replace(')', '')  # print(formula)  return formula# do + and - calculationdef do_plus_minus(formula):  while True:    result = re.search(the_pm, formula)    if result:      group = result.group()      r = eval(group)      print('plus_minus:', formula, group, r, sep=' | ')      formula = formula.replace(group, str(r))      # print(formula)    else:      break  formula = formula.replace('(', '').replace(')', '')  # print(formula)  return formulaprint('original formula and result:', formula, eval(formula), sep=' | ')while True:  result = re.search(the_one, formula)  if result:    group = result.group()    print('main:', formula, group, sep=' | ')    new_group = do_times_divide(group)    formula = formula.replace(group, new_group)    formula = formula.replace(new_group, do_plus_minus(new_group))    formula = formula.replace('+-', '-')  else:    breakprint('formula after parsing and result:', formula, eval(formula), sep=' | ')