import re
def format_string(s): # 对表达式进行格式化
s = s.replace(' ', '')
s = s.replace("--", "+")
s = s.replace("++", "+")
s = s.replace("+-", "-")
s = s.replace("*+", "*")
s = s.replace("/+", "/")
return s
def check_expression(s): # 对表达式进行检测
flag = True
if not s.count("(") == s.count(")"):
print("括号没有闭合")
flag = False
if re.findall('[a-z]+', s.lower()):
print("有非法字符")
flag = False
return flag
def calc_mul_div(s):
regular = '[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*'
while re.findall(regular, s):
expression = re.search(regular, s).group()
if expression.count("*"): # 判断是否是乘法
x, y = expression.split("*")
mul_result = str(float(x) * float(y))
s = s.replace(expression, mul_result)
s = format_string(s)
if expression.count("/"): # 判断是否是除法
x, y = expression.split('/')
div_result = str(float(x) / float(y))
s = s.replace(expression, div_result)
s = format_string(s)
return s
def calc_add_sub(s): # 判断加减法
add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
while re.findall(add_regular, s):
add_list = re.findall(add_regular, s)
for add_str in add_list:
x, y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
s = s.replace(add_str, add_result)
s = format_string(s)
while re.findall(sub_regular, s):
sub_list = re.findall(sub_regular, s)
for sub_str in sub_list:
numbers = sub_str.split("-")
if len(numbers) == 3: # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
# 如果表达式类似 8-2, 则 list 是 ['8', '2']
result = 0
for v in numbers:
if v:
result -= float(v)
else:
x, y = numbers
result = float(x) - float(y)
s = s.replace(sub_str, "+" + str(result))
s = format_string(s)
return s
if __name__ == "__main__":
s = '(( 2 /1 * 7 ) - ( 3 *4 ) )'
if check_expression(s):
s = format_string(s)
while s.count("(") > 0:
strs = re.search('\([^()]*\)', s).group()
replace_str = calc_mul_div(strs)
replace_str = calc_add_sub(replace_str)
s = format_string(s.replace(strs, replace_str[1:-1])) # 去掉多余的括号
else:
replace_str = calc_mul_div(s)
replace_str = calc_add_sub(replace_str)
s = s.replace(s, replace_str)
print("result: ", s.replace("+", ""))
运行结果:
result: 2.0