import re def nul_div(source): """ 处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算 :param source: 要进行计算的字符串 :return:
import re def nul_div(source): """ 处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算 :param source: 要进行计算的字符串 :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串 """ source = str_format(source) while re.search(‘\*|/‘, source): ret = re.search(‘[. 0-9]+?[\*/][+-]?[. 0-9]+‘, source).group() res_data = re.findall(‘(-?[\d\.]+|\*|/)‘, ret) if res_data[1] == ‘*‘: res = float(res_data[0]) * float(res_data[2]) else: res = float(res_data[0]) / float(res_data[2]) source = source.replace(ret, str(res)) return source def add_sub(source): """ 处理加法和减法,先利用搜索出需要进行加法和减法的表达式,然后利用正则将字符串分割,进行加法和减法的运算 :param source: 要进行计算的字符串 :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串 """ source = str_format(source) while re.search(‘[\+-]?[.0-9]*[\+-]+[.0-9]*‘, source): ret = re.search(‘[\+-]?[.0-9]*[\+-]+[.0-9]*‘, source).group() res_data = re.findall(r‘([\d\.]+|\+|-)‘, ret) if len(res_data) == 2: if res_data[0] == ‘-‘: res = -float(res_data[1]) else: res = float(res_data[1]) source = source.replace(ret, str(res)) return source elif len(res_data) > 2: if res_data[0] == ‘-‘: if res_data[2] == ‘-‘: res = - float(res_data[1]) - float(res_data[3]) else: res = - float(res_data[1]) + float(res_data[3]) elif res_data[0] == ‘+‘: if res_data[2] == ‘-‘: res = float(res_data[1]) - float(res_data[3]) elif res_data[2] == ‘+‘: res = float(res_data[1]) + float(res_data[3]) else: res = float(res_data[1]) else: if res_data[1] == ‘-‘: res = float(res_data[0]) - float(res_data[2]) else: res = float(res_data[0]) + float(res_data[2]) else: res = float(res_data[0]) source = source.replace(ret, str(res)) return source source = source.replace(ret, str(res)) return source # def add_sub(source): # """ # 处理加法和减法,先利用搜索出需要进行加法和减法的表达式,然后利用正则将字符串分割,进行加法和减法的运算 # :param source: 要进行计算的字符串 # :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串 # """ # source = str_format(source) # while re.search(‘[. 0-9]+?[\+-][. 0-9]+‘, source): # ret = re.search(‘[\+-]?[.0-9]+?[\+-][. 0-9]+‘, source).group() # print(ret) # res_data = re.findall(r‘([\d\.]+|\+|-)‘, ret) # print(res_data) # if res_data[0] == ‘-‘: # if res_data[2] == ‘-‘: # res = - float(res_data[1]) - float(res_data[3]) # else: # res = - float(res_data[1]) + float(res_data[3]) # elif res_data[0] == ‘+‘: # if res_data[2] == ‘-‘: # res = float(res_data[1]) - float(res_data[3]) # else: # res = float(res_data[1]) + float(res_data[3]) # else: # if res_data[1] == ‘-‘: # res = float(res_data[0]) - float(res_data[2]) # else: # res = float(res_data[0]) + float(res_data[2]) # source = source.replace(ret, str(res)) # return source def check_expression(source): """ 检查字符串是否可以进行正常计算,看括号是否相等,是否含有字母 :param source: 要进行计算的字符串 :return: 如果不能正常进行计算返回False,否则返回True """ check_result = True if not source.count(‘(‘) == source.count(‘)‘): print(‘表达式错误!请检查表达式中"("")"是否相等‘) check_result = False if re.findall(‘[a-z]‘, source.lower()): print(‘表达式错误!请检查表达式中是否含有字母‘) check_result = False return check_result def str_format(source): """ 对字符串进行简单的替换,替换空格和加减法的符号 :param source: 要进行替换的字符串 :return: 返回替换后的字符串 """ source = source.replace(‘ ‘, ‘‘) source = source.replace(‘++‘, ‘+‘) source = source.replace(‘+-‘, ‘-‘) source = source.replace(‘-+‘, ‘-‘) source = source.replace(‘--‘, ‘+‘) return source def str_calculation(source): """ 计算字符串,先判断是否可以计算,然后进行简单的替换,判断是否含有括号,进行计算 :param source: 要进行计算的字符串 :return: 返回计算结果 """ if check_expression(source): data = str_format(source) while re.search(‘\(‘, data): r_data = re.search(‘\([^()]+\)‘, data).group() data_r = nul_div(r_data) data_r = add_sub(data_r) data = str_format(data.replace(r_data, data_r[1:-1])) else: data_r = nul_div(data) data_r = add_sub(data_r) data = str_format(data.replace(data, data_r)) return data if __name__ == ‘__main__‘: s = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )" s1 = ‘1-2*((60-30-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘ s2 = ‘--9‘ print(str_calculation(s)) print(eval(s)) print(str_calculation(s1)) print(eval(s1)) print(str_calculation(s2)) print(eval(s2))