Python实例---利用正则实现计算器[FTL版]
2023-09-11 14:20:11 时间
import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = str.replace('+-', '-') str = str.replace('*+', '*') str = str.replace('/+', '/') str = str.replace('++', '+') str = str.replace(' ', '') # 表达式检查 def check_exp(str): ret = True # 匹配括号 if not str.count('(') == str.count(')'): print("表达式错误,括号未闭合") ret = False if re.findall('[a-z]+', str.lower()): print('表达式错误,非法字符!!!') ret = False return ret # 计算乘除法 (30 + 6 * 2) def cal_mul_div(str): # 取出第一个乘法或者除法的表达式 regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*' while re.findall(regular, str): # 获取表达式 expr = re.search(regular, str).group() # 计算乘法 if expr.count('*') == 1: # 获取要计算的2个数字 x, y = expr.split('*') # 计算乘法 mul_result = str(float(x) * float(y)) # 结果替换表达式 str = str.replace(expr, mul_result) str = format_str(str) # 计算除法 elif expr.count('/') == 1: # 获取要计算的2个数字 x, y = expr.split('/') # 计算乘法 div_result = str(float(x) / float(y)) # 结果替换表达式 str = str.replace(expr, div_result) str = format_str(str) # 计算幂次方 elif expr.count('*') == 2: # 获取要计算的2个数字 x, y = expr.split('*') # 计算幂次方 pow_result = 1 for i in range(int(y)): pow_result *= int(x) # 结果替换表达式 str = str.replace(expr, str(pow_result)) str = format_str(str) return str # 加减法运算 def cal_div_sub(str): # 取出第一个乘法或者除法的表达式 add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*' sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*' # 计算加法 add_list = re.findall(add_regular, str) for add_str in add_list: x, y = add_str.split('+') add_result = "+" + str(float(x) + float(y)) str = str.replace() return str # 计算减法 sub_list = re.findall(sub_regular, str) for sub_str in sub_list: if __name__ == '__main__': ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))' if check_exp(ss): print('Source:', ss) print('eval result:', eval(ss)) ss = format_str(ss) print('Format result:', ss) # 判断是否右括号 while ss.coumt('(') > 0: # 取出括号 str = re.search('\([^()]*\)', ss).group() # 将括号的表达式进行乘法除法运算 replace_str = cal_mul_div(str) # 将运算结果进行加法减法运算 replace_str = cal_div_sub(replace_str) # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1] ss = format_str(ss.replace(str, replace_str[1:-1])) else: replace_str = cal_mul_div(ss) # 将运算结果进行加法减法运算 replace_str = cal_div_sub(replace_str) # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1] ss = ss.replact(ss, replace_str) print("Final result:", ss.replace('+', ''))
【更多参考】
相关文章
- 实例探究Python以并发方式编写高性能端口扫描器的方法
- python语法基础_01.Python基础
- python 保存图片_用Python从视频中提取每一帧的图片
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- Python获取https证书信息实例
- Python之eval函数实例解释
- python lambda表达式解释实例
- python的[:-1]和[::-1]用法及结果实例(取反、删除末尾字符串)
- 【华为OD机试真题 python】 高矮个子排队【2022 Q4 | 100分】
- python input函数
- gyp ERR! stack Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.
- 【Python】【PyPI】twine模块打包python项目上传pypi
- Python进程
- python librosa 实例解析
- python中记录打印的log模块logging的用法实例
- Python实例 遍历文件夹和文件
- (转)Python中的常见特殊方法—— repr方法
- Python基础入门-while循环示例
- 【Python分布式服务框架】python实现gRPC服务
- Python实例---利用正则实现计算器[参考版]
- python列表中的insert( )方法
- Python 基础 之 python 进程知识点整理,实现一个简单使用进程池的多进程文件夹文件copy器
- python第七课——循环结构 while
- 【python 学习】——pycharm终端解释器和Python解释器配置
- 【Python数据结构】——并查集的实现(查找、合并、集合、实例)