当前位置:首页 > 教育 >

正则表达式计算器(正则表达式计算带备注的公式)

来源:原点资讯(m.360kss.com)时间:2024-05-31 05:55:31作者:YD166手机阅读>>

Python开发——利用正则表达式实现计算器算法

(1)不使用eval()等系统自带的计算方法

(2)实现四则混合运算、括号优先级解析

思路:

1、字符串预处理,将所有空格去除

2、判断是否存在括号运算,若存在进行第3步,若不存在则直接进入第4步

3、利用正则表达式获取最底层括号内的四则运算表达式

4、将四则运算表达式进行预处理:表达式开头有负数时,在表达式前加上一个0

5、利用re.split()、re.findall()方法,通过加减符号,对四则运算进行拆分为乘除运算式和数字,并保留对应的位置下标。

6、利用re.split()、re.findall()方法,通过乘除符号,将乘除式拆分为乘除符号与数字,然后进行计算,并返回数值。

7、通过re.split()、re.findall()保留的下标位置,将表达式还原。

8、完成所有乘除运算之后,返回进行加减运算。

9、完成加减运算后,返回表达式进行替代。

10、通过递归函数,完成所有括号运算后。最后再完成一次四则运算即可完成所有运算。


注:在过程中,负数的处理存在三个要点:当负数出现在表达式开头、负数前面存在减法、乘除式中存在负数且不在表达式开头。

(1)当负数出现在表达式开头:在前面加上一个0

(2)负数前面存在减法:每次完成一次运算后需要进行一次符号检查替换

(3)乘除式中存在负数且不在表达式开头:将负号移到表达式最开头

import re def update_formula(calc_list,calc_operator_list): # 通过拆分后的表达式列表与符号列表重新组合 for index,item in enumerate(calc_list): if index == 0: formula = item elif index != 0: formula = calc_operator_list[index-1] item return formula def negative_start_issue(formula): #处理负数在括号内表达式开头的情形 calc_list = re.split("[ -]",formula) #通过 -符号将各个乘除运算分隔出来 calc_operator_list = re.findall("[ -]",formula) for index,item in enumerate(calc_list): if index == 0 and item == '': # 处理负号在开头的问题 calc_list[index] = '0' else: calc_list[index] = item.strip() formula = update_formula(calc_list,calc_operator_list) return formula def deal_unusual_issue(formula): # 双加减符号处理 formula = formula.replace(" ","") #去掉空格 formula = formula.replace(" "," ") formula = formula.replace(" -", "-") formula = formula.replace("- ", "-") formula = formula.replace("--", " ") return formula def deal_negative_issue(formula): # 处理乘除运算中负数的计算问题(分前后位置两种情况) # 1.负数在后 m = re.search("[0-9] [.]*[0-9]*[*|/][-][0-9] [.]*[0-9]*",formula) # minus_pre = re.search("[0-9] [.]*[0-9]*[*|/][-][0-9] [.]*[0-9]*",formula).group() # 注意匹配的必要项与非必要项,如:"[0-9] [.][0-9] [*|/][-][0-9] [.][0-9] "误把非必要项当做必要项。 if m: minus_pre = m.group() minus_pro = "-" minus_pre.replace("-","") formula = formula.replace(minus_pre,minus_pro) if "*-" in formula or "/-" in formula: return deal_negative_issue(formula) # 2.负数在前 formula = deal_unusual_issue(formula) return formula def multiply_divide(formula): # print("[%s]"%formula,formula) # 乘除计算 calc_list = re.split("[*/]", formula) operator_list = re.findall("[*/]", formula) # 将乘号除号通过列表方式分隔出来 # print("sub_calc_list:", sub_calc_list) # print("sub_operator_list:", sub_operator_list) res = 0 for index2, i in enumerate(calc_list): if index2 == 0: res = float(i) else: if operator_list[index2 - 1] == '*': # 通过sub_operator_list中的index判断到底是加法还是减法, res *= float(i) elif operator_list[index2 - 1] == '/': res /= float(i) return res def add_abstract(formula): # 加减计算 # 1.开头位置负数处理 formula = negative_start_issue(formula) # 2.双加减符号处理 formula = deal_unusual_issue(formula) # 3.加减逻辑运算 calc_list = re.split("[ -]", formula) operator_list = re.findall("[ -]", formula) res = 0 for index, i in enumerate(calc_list): if index == 0: res = float(i) else: if operator_list[index-1] == ' ': res = float(i) elif operator_list[index-1] == '-': res -= float(i) return res """ 四则混合运算主函数 """ def elementary_arithmetic(formula): # 负数处理 formula = negative_start_issue(formula) formula = deal_negative_issue(formula) # 乘除运算 calc_list = re.split("[ -]",formula) # 通过 -符号将各个乘除运算分隔出来 calc_operator_list = re.findall("[ -]",formula) for index1, item in enumerate(calc_list): calc_list[index1] = str(multiply_divide(item)) #数据类型的强制转换!!! formula = update_formula(calc_list,calc_operator_list) # 加减运算 formula = add_abstract(formula) return formula """ 括号运算 """ def calculator(formula): #数据预处理 formula = formula.replace(" ","") m = re.search("\([^()]*\)",formula) # 判断是否需要进行括号运算 if m: # 括号运算 # 提取最小括号运算式,计算结果,并返回。 subformula = m.group().strip("()") # 把找出来的括号剥离 print("subformula:",subformula,type(subformula)) subres = elementary_arithmetic(subformula) # 调用四则混合运算主函数 print("subres:",subres) formula = formula.replace(m.group(), str(subres)) print("updated formula:",formula) if "(" in formula: return calculator(formula) else: print("formula result:",formula) # 除去所有括号后可能出现:1-2*-312.8 formula = elementary_arithmetic(formula) return formula else: return elementary_arithmetic(formula) # 以下为测试代码: formula = "1 - 2 * ( (60-30 (-40/5) * (9-2*5/3 7 /3*9/4*28 10 * 56/14 )) - (-4*3)/ (16-3*2) )" print("%s = "%formula,calculator(formula)),

栏目热文

正则表达式详解20分钟(正则表达式30分钟入门教程)

正则表达式详解20分钟(正则表达式30分钟入门教程)

选自janmeppe.com作者:Jan Meppe机器之心编译参与:韩放、杜伟这篇博客是关于正则表达式(regex)的...

2024-05-31 05:47:23查看全文 >>

正则表达式新手教程(正则表达式菜鸟教程)

正则表达式新手教程(正则表达式菜鸟教程)

正则表达式,简单却又复杂,强大却又薄弱,本身的功能很强,但却令人望而却步。作为程序员必须掌握的技能之一,千万别被正则表达...

2024-05-31 05:45:59查看全文 >>

正则表达式简单入门(正则表达式入门经典语句)

正则表达式简单入门(正则表达式入门经典语句)

简介正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹...

2024-05-31 05:48:26查看全文 >>

歌词中有颠沛流离的歌女生唱的(歌词中有颠沛流离的歌)

歌词中有颠沛流离的歌女生唱的(歌词中有颠沛流离的歌)

古风爱情歌曲《桐花念》专辑封面 满地桐花相思念 日前,由武夷影业集团出品,东方国韵集团制作,田七作词,导演田七、知...

2024-05-31 05:12:14查看全文 >>

人生颠沛流离粤语歌(颠沛流离的粤语歌曲完整版)

人生颠沛流离粤语歌(颠沛流离的粤语歌曲完整版)

音乐推荐1992年,李克勤凭借一首旋律欢快积极励志的《红日》赢得了无数歌迷朋友的心。《红日》作为一个时代的经典作品,让听...

2024-05-31 05:26:24查看全文 >>

正则表达式30分钟入门教程(正则表达式30分钟入门教程 deerchao)

正则表达式30分钟入门教程(正则表达式30分钟入门教程 deerchao)

正则表达式30分钟入门教程一些要说的话:如果你没有正则表达式的基础,请跟着教程“一步步来”。请不要大概地扫两眼就说看不懂...

2024-05-31 05:23:32查看全文 >>

绞丝旁怎样写好看图解

绞丝旁怎样写好看图解

这是我在头条分享的第 7 个偏旁。今天分享一个绞丝旁“纟”的书写技巧。四个书写技巧1.绞丝旁由两个“撇折”加一个“提”组...

2024-05-31 05:47:36查看全文 >>

绞丝旁加四个又(绞丝旁加4个又念什么)

绞丝旁加四个又(绞丝旁加4个又念什么)

行楷 | 绞丝旁及例字解析,4张图片学行楷​​ ,...

2024-05-31 05:54:39查看全文 >>

锦绣南歌主题歌谁唱(锦绣南歌电视剧主题歌)

锦绣南歌主题歌谁唱(锦绣南歌电视剧主题歌)

新歌郑云龙《锦绣南歌》OST7月11日,由郑云龙演唱的电视剧《锦绣南歌》人物主题曲《莫失莫忘》上线。 钢琴和弦乐相融的前...

2024-05-31 05:46:49查看全文 >>

哪些字带有户字头(带户字头的字大多和什么有关)

哪些字带有户字头(带户字头的字大多和什么有关)

“户”字头的字,草书好像很简单,但它并不简单,你真的知道它为什么这么写吗?1.“户”字我们首先来看一下“户”字的来源,像...

2024-05-31 05:32:54查看全文 >>

文档排行