千家信息网

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 圣斗士星矢正义传说换服务器 山西组织网络安全演练 创酷网络技术有限公司怎么样 网络安全防护技术发展前景 如何创建数据库并查询 数据库表级约束和列级约束 我的世界怎么创服务器手机版
0