python字符串四则运算式编码解题分析
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"python字符串四则运算式编码解题分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网科技公司华为
互联网为科技
互联网科技金融
深圳互联网科技公司
易互联网科技有限公司
深圳互联网络科技有限公司
互联网女皇 腾讯科技
广州紫鲸互联网科技
左右互联网络科技
甘肃拓世互联网科技有限公司
茂名市互联网科技产业园
湖南诚度互联网科技有限公司
崇明区互联网教育科技诚信经营
互联网科技公司有风险吗
注册互联网科技公司经营范围大全
广州新华互联网科技学校电竞方面
爱医互联网络科技
朱啸虎曾投资哪些互联网科技企业
兰石爱特工业互联网科技分公司
互联网科技大佬云集
互联网科技巨头监管
艾特科技互联网
卓越科技互联网 招聘
互联网金融科技公司干啥的
福建科技产业互联网发展
彤创互联网科技有限公司
互联网科技大奖都有哪些公司
元气玛特互联网科技公司是外包吗
同城互联网络科技
科技美学互联网 艺术