python字符串四则运算式编码解题分析
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,本篇内容介绍了"python字符串四则运算式编码解题分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2025年02月05日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安全错误
数据库的锁怎样保障安全
网络安全攻防虚拟仿真
app的服务器崩溃的原因
腾讯轻量服务器数据转移
邹平瓷砖软件开发咨询
网络安全运行失常调节系统
数据库链接网页
腾讯服务器如何看用户名
成安县财政局网络安全等保
联想服务器关机后如何开机
浙大中控数据库db
cache数据库审计
计算机软件开发专业怎么样
pc服务器和app
广州迈进网络技术有限公司
山东运营网络技术服务哪家好
drugbank是几级数据库
网络安全问题带给电商的烦恼
数据库的技术
利用社会网络技术演化分析
什么是数据库规范理论
常州公司网络安全准入控制
数据库修改用户密码不能登录
网络安全协议第二版pdf
圣斗士星矢正义传说换服务器
山西组织网络安全演练
创酷网络技术有限公司怎么样
网络安全防护技术发展前景
如何创建数据库并查询
数据库表级约束和列级约束
我的世界怎么创服务器手机版