import re
#检查输入是否有非法字符
def check_expreesion(st):
string = True
if re.findall('[a-z]+',st.lower()):
print(re.findall('[a-z]+',st))
print('表达式有非法字符')
string = False
if not st.count('(') == st.count(')'):
print("表达式错误,括号未闭合")
string = False
if re.findall('[()]',st):
print('表达式有中文括号')
string = False
if re.findall('(\/\*)',st):
print('表达式/*同时连在一起了')
string = False
if re.findall('(\*\/)',st):
print('表达式*/同时连在一起了')
string = False
return string
def format_str(st):
st = st.replace('--', '+')
st = st.replace('++', '+')
st = st.replace('+-', '-')
st = st.replace('*+', '*')
st = st.replace('/+', '/')
st = st.replace('-+', '-')
st = st.replace(' ', '')
return st
def cal_nul_div(st):
regular = '[\-]?\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
while re.findall(regular, st):
expression = re.search(regular, st).group()
#print(expression)
#如果是乘法
if expression.count("*")==1:
x,y = expression.split("*")
# print(x,y)
mul_cal = str(float(x) * float(y))
st = st.replace(expression,mul_cal)
# print(st)
if expression.count("/")==1:
x, y = expression.split("/")
# print(x, y)
mul = str(float(x) / float(y))
mul = st.replace(expression, mul)
st = format_str(mul)
# print(st)
# if not re.findall('(\/|\*)',st):
# return st
return st
# print(st)
def add_sub(string):
add_rule = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_rule = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
while re.findall(add_rule, string):
add = re.findall(add_rule,string)
for i in add:
x, y = i.split("+")
sub = str(float(x) + float(y))
sub = '+' + sub
string = string.replace(i,sub)
string = format_str(string)
# print(string)
while re.findall(sub_rule,string):
sub = re.findall(sub_rule,string)
# print(len(sub))
for sub_str in sub:
numbers = sub_str.split("-")
if len(numbers) == 3:
result = 0
for v in numbers:
if v:
result -= float(v)
else:
x, y = numbers
result = float(x) - float(y)
string = string.replace(sub_str, "+" + str(result))
string = format_str(string)
# print(string)
return string
if __name__ =="__main__":
formula = ' 2 -3+(-9-2+3*5/4-3+5+(-1+4.3/2-3.5+2.5-0.1-1)/(-9-3/6*3)+5)+((3*3+2.5)/(-9-3/6*3))*3'# 对这串式子进行运算,不能使用运算模块
if check_expreesion(formula):
# print(formula)
formula = format_str(formula)
while formula.count('(') > 0:
st = re.search('\([^()]*\)',formula).group()
cal_nul = cal_nul_div(st)
add_subs = add_sub(cal_nul)
formula = format_str(formula.replace(st, add_subs[1:-1]))
print(formula)
else:
replace_str = cal_nul_div(formula)
# print(replace_str)
replace_str = add_sub(replace_str)
# print(replace_str)
formula = formula.replace(formula, replace_str)
print(formula.replace('+',''))