python字符串四则运算式编码解题分析
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容介绍了"python字符串四则运算式编码解题分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2025年12月03日python字符串四则运算式编码解题分析
本篇内容介绍了"python字符串四则运算式编码解题分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
首先循环查找最内层括号,对其中的运算式求解,然后将结果替换掉字符串中对应的运算式。循环求解直到整个运算式所有括号均被解。
对不含括号的运算式求解时从左到右,先循环解出所有除法,再循环解出所有乘法,再做加减法。
解括号
首先看题目案例:
'10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'
首先要提取内层括号内的所有字符,编写正则表达式如下:
'\(([^()]+?)\)'# \(和\)是为了匹配左括号和右括号,注意左右括号在正则表达式表示分组的意思,所以要加\转义成原本括号的意思。# [^()]字符组内^表示非,^()表示匹配不含括号的内容# +?表示匹配内容为1个或多个,最小匹配模式# ([^()]+?)表示对不含括号的内容作为分组提取
编写解括号的代码:
def cal(s):s = s.replace(' ', '') # 去除字符串中所有空格,防止匹配出错while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i)) # count函数用来计算不含括号的加减乘除运算式s = s.replace('--', '+') # 注意一:处理解括号后可能出现减负号的情况else:s = count(s)return s解乘除
这里是计算不含括号的加减乘除运算式,首先要做除法,那么先要提取除法运算式左右两边的数字,编写正则表达式如下:
([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)# [-]?表示可能存在负号# \d+\.\d+表示匹配浮点数# [-]?\d+表示匹配整数# ([-]?\d+\.\d+|[-]?\d+)表示提取正负浮点数或正负整数# ([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+) 表示提取/两边的正负浮点数或正负整数
循环运算除法过程:
def count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')循环运算乘法过程(乘法的正则和除法的正则只差一个运算符):
while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0: # 注意二:负数乘负数得正数s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')解加减法
解加减法的感觉是最简单的一步,只要按上面的正则匹配出正负浮点数或正负整数,然后对所有数值累加即可。
result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return s完整代码
import redef count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0:s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return sdef cal(s):s = s.replace(' ', '')while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i))s = s.replace('--', '+')else:s = count(s)return sprint(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))'))print(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'))print(cal('10 - 3 * ( (50-30 +(-10/5) * (9-2*5/3 + 7 /3*99/4*2020 +10 * 789/15 )) - (-4*3)/ (16-3*2) )'))out:58.088.0703066.4000000001注意事项
注意一:处理解括号后可能出现减负号的情况。
注意二:负数乘负数得正数。
上述两条注意事项在编码时并未考虑到,后来运行程序发现结果不对,调试了很久才发现上述2个注意事项被忽略了,最后加上了2行代码后运算结果正确无误。
基本四则运算已经都非常熟悉了,但编码过程中还是会有疏漏。这在编写项目时经常会发生类似情况。程序员和需求方沟通时经常会发生类似情况,需求方经常因为有些是常识性的细节忘了提及,而程序员不精通业务需求方的业务,此时在需求方未提及的细节程序员也未考虑周全就会产生疏漏和bug。
所以加强沟通非常重要,程序员考虑需求全面且细致非常重要。
"python字符串四则运算式编码解题分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
括号
运算
算式
字符
正则
正负
循环
内容
情况
程序
除法
需求
字符串
编码
整数
点数
程序员
负数
过程
需求方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
sqlite3 数据库日志
vnc网络安全训练营
蓝思网络技术有限公司职友集
国家怎样保障网络安全
网络技术求助应该打哪个电话
128g内存16核cpu服务器
软件开发过程管理的极限模型
智能化软件开发共同合作
嘉定区项目数据库服务商新报价
百度网络安全大会
中国的4g网络技术
物联网网络安全厂商
大数据一般用什么数据库
山东济南互联网科技公司
非标自动化设备软件开发
电力代维软件开发
党的十九大关于网络安全的论文
终端与服务器命令
微博保存数据库失败怎么办
数据库可变长字符型有什么问题
服务器拿来干嘛
怎么查看服务器环境
网络安全形势意识体会
数据库采用的数据模型
滴滴网络安全调查
良品铺子商城软件开发的
运营方维护网络安全
中小学生网络安全绘画教程
提高网络安全教育的方法
工程项目进度管理软件开发多少钱