import re
# 格式化
def format_str(str):
str = str.replace('--', '+')
str = str.replace('-+', '-')
str = str.replace('+-', '-')
str = str.replace('*+', '*')
str = str.replace('/+', '/')
str = str.replace('++', '+')
str = str.replace(' ', '') # 表达式检查
def check_exp(str):
ret = True
# 匹配括号
if not str.count('(') == str.count(')'):
print("表达式错误,括号未闭合")
ret = False
if re.findall('[a-z]+', str.lower()):
print('表达式错误,非法字符!!!')
ret = False
return ret # 计算乘除法 (30 + 6 * 2)
def cal_mul_div(str):
# 取出第一个乘法或者除法的表达式
regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
while re.findall(regular, str):
# 获取表达式
expr = re.search(regular, str).group()
# 计算乘法
if expr.count('*') == 1:
# 获取要计算的2个数字
x, y = expr.split('*')
# 计算乘法
mul_result = str(float(x) * float(y))
# 结果替换表达式
str = str.replace(expr, mul_result)
str = format_str(str)
# 计算除法
elif expr.count('/') == 1:
# 获取要计算的2个数字
x, y = expr.split('/')
# 计算乘法
div_result = str(float(x) / float(y))
# 结果替换表达式
str = str.replace(expr, div_result)
str = format_str(str)
# 计算幂次方
elif expr.count('*') == 2:
# 获取要计算的2个数字
x, y = expr.split('*')
# 计算幂次方
pow_result = 1
for i in range(int(y)):
pow_result *= int(x)
# 结果替换表达式
str = str.replace(expr, str(pow_result))
str = format_str(str)
return str # 加减法运算
def cal_div_sub(str):
# 取出第一个乘法或者除法的表达式
add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
# 计算加法
add_list = re.findall(add_regular, str)
for add_str in add_list:
x, y = add_str.split('+')
add_result = "+" + str(float(x) + float(y))
str = str.replace()
return str
# 计算减法
sub_list = re.findall(sub_regular, str)
for sub_str in sub_list: if __name__ == '__main__':
ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))'
if check_exp(ss):
print('Source:', ss)
print('eval result:', eval(ss))
ss = format_str(ss)
print('Format result:', ss)
# 判断是否右括号
while ss.coumt('(') > 0:
# 取出括号
str = re.search('\([^()]*\)', ss).group()
# 将括号的表达式进行乘法除法运算
replace_str = cal_mul_div(str)
# 将运算结果进行加法减法运算
replace_str = cal_div_sub(replace_str)
# 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
ss = format_str(ss.replace(str, replace_str[1:-1]))
else:
replace_str = cal_mul_div(ss)
# 将运算结果进行加法减法运算
replace_str = cal_div_sub(replace_str)
# 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
ss = ss.replact(ss, replace_str)
print("Final result:", ss.replace('+', ''))

【更多参考】

Python实例---利用正则实现计算器[参考版]

Java实例---计算器实例

Python实例---利用正则实现计算器[FTL版]的更多相关文章

  1. Python实例---利用正则实现计算器[参考版]

    利用正则进行运算规则的计算 版本一: # import re # # ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / ...

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

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  3. 【Python】利用正则解析xml练习题

    { "date": "18-03-29 06:04:47", "data": { "deviceType": 1, &q ...

  4. python模块之正则

    re模块 可以读懂你写的正则表达式 根据你写的表达式去执行任务 用re去操作正则 正则表达式 使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容.在线测试网站:http:/ ...

  5. Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114

    年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...

  6. (转)Python实例手册

    原文地址:http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7 实在是太好的资料了,不得不转 python实例手册 #encodi ...

  7. 转载 python实例手册

    python实例手册 #encoding:utf8# 设定编码-支持中文 0说明 手册制作: 雪松 更新日期: 2013-12-19 欢迎系统运维加入Q群: 198173206 # 加群请回答问题 请 ...

  8. 【转载】python实例手册

    今天写爬虫的时候遇到了问题,在网上不停地查找资料,居然碰到两篇好文章: 1.python实例手册   作者:没头脑的土豆 另一篇在这:shell实例手册 python实例手册 #encoding:ut ...

  9. Python实例手册

    在电脑中突然发现一个这么好的资料,雪松大神制作,不敢独享,特与大家共享.连他的广告也一并复制了吧! python实例手册 #encoding:utf8 # 设定编码-支持中文 0说明 手册制作: 雪松 ...

随机推荐

  1. R语言查找变量ls函数

    要知道目前在工作区中的可用变量,可以使用 ls()函数列出所有变量. 另外,ls() 函数可以使用模式来匹配变量名称. print(ls()) 当上面的代码执行时,它产生以下结果: [1] " ...

  2. Mozilla新特性只支持https网站,再次推动SSL证书普及

    Mozilla的官方博客2015.4.30正式宣布了淘汰HTTP的方案. 其中包括:设定一个日期,所有的新特性将只提供给HTTPS网站:HTTP网站将逐步被禁止访问浏览器功能,尤其是那些与用户安全和隐 ...

  3. Django 用模板来节省公共代码,

          如果我们有一个后台网站,或者显示个人信息的网站 标题logo,边框等信息的代码都是固定的,只有部分区域是改变, 我们如果用Django来写html的话就会重复代码.这时候我们只要用模板的方 ...

  4. 关于ActiveX在WebBrowser不加载问题

    最近在做电子面单打印,需要在CS端集成web,这里我使用了WebBrowser,下文简称“wb”. wb可以简单的理解为IE的阉割版,它是支持ActiveX的,首先要确保ActiveX在IE中正常安装 ...

  5. [转]Getting started with ASP.NET Web API OData in 3 simple steps

    本文转自:https://blogs.msdn.microsoft.com/webdev/2013/01/29/getting-started-with-asp-net-web-api-odata-i ...

  6. HTTP协议状态码学习

    一直以来都在追求实战,从而忽视了对理论知识的深入学习和理解.这并不可怕,可怕的是当意识到自己的不足时,没有行动. 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码   说明 ...

  7. [Linux]C语言Linux系统编程创建进程

    1.进程ID 每一个进程都由一个唯一的标识符表示,即进程ID,简称pid.系统保证在某时刻每个pid都是唯一的. 1.1分配进程ID 缺省情况下,内核将进程ID的最大值限制为32768,可以在此处设置 ...

  8. 三、hive JavaAPI示例

    在上文中https://www.cnblogs.com/lay2017/p/9973370.html 我们通过hive shell去操作hive,本文我们以Java代码的示例去对hive执行加载数据和 ...

  9. C/C++:Windows cmd 指令

    一.快捷键1. Windows键 自从104键盘首次加入Windows键后,微软便一直计划为这个键添加更多功能,当然Win8也不例外. * Win+C:调出应用Charm菜单(Metro.传统桌面) ...

  10. 撩课-Web大前端每天5道面试题-Day2

    1.伪类与伪元素的区别? 1) 定义区别 伪类 伪类用于选择DOM树之外的信息,或是不能用简单选择器进行表示的信息. 前者包含那些匹配指定状态的元素,比如:visited,:active:后者包含那些 ...