Python编写简单计算器(正则表达式应用)

需求——开发一个简单的Python计算器

1.实现加减乘除以及括号优先级解析
2.用户输入3+5*((80-40+(-40/8)*(9-2*9/3-5/3*98/4*2998+10*568/14))-(-4*6)/(27-3*8))等类似公式后,必须自己解析出里面的各种符号(不得调用eval等偷懒),运算后得出结果,结果要正确。

总程序

 1 import re
 2 #一、对公式进行简单处理(去掉空格及公式化简)
 3 def format_string(string):
 4     string = string.replace(‘ ‘,‘‘)
 5     string = string.replace(‘++‘,‘+‘)
 6     string = string.replace(‘+-‘,‘-‘)
 7     string = string.replace(‘-+‘,‘-‘)
 8     string = string.replace(‘--‘,‘+‘)
 9     string = string.replace(‘*+‘,‘*‘)
10     string = string.replace(‘/+‘,‘/‘)
11     return string
12 #二、对于不符合要求的公式进行异常处理,给出错误提示信息
13 def check_expression(string):
14     check_result = True
15     if not string.count("(") == string.count(")"):
16         print(‘括号不对称‘)
17         check_result = False
18     if re.findall(‘[a-z]‘,string.lower()):
19         print(‘表达式有错,包含非法字符‘)
20         check_result = False
21     return check_result
22 #三、进行乘除运算,并将计算的结果替换掉原公式中的乘除法运算
23 def mul_div(string):
24     #正则表达式匹配(匹配乘除)
25     regular = ‘\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*‘
26     #一直到公式中没有除法或乘法运算时,退出循环
27     while re.findall(regular,string):#注意:乘除法可以没有顺序
28         expression = re.search(regular,string).group()
29         # 计算乘法,并将计算的结果替换原来的式子
30         if expression.count(‘*‘):
31             x,y=expression.split(‘*‘)
32             mul_result=str(float(x)*float(y))
33             string=string.replace(expression,mul_result)
34             string=format_string(string)
35         # 计算除法,并将计算的结果替换原来的式子
36         elif expression.count(‘/‘):
37             x, y = expression.split(‘/‘)
38             div_result = str(float(x) / float(y))
39             string = string.replace(expression, div_result)
40             string = format_string(string)
41     return string
42 #四、进行加减法运算
43 def add_sub(string):
44     add_regu = ‘[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*‘
45     sub_regu = ‘[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*‘
46     # 计算加法,注意:加减法也可以没有顺序
47     while re.findall(add_regu,string):
48         add_list=re.findall(add_regu,string)
49         for add_str in add_list:
50             x, y = add_str.split("+")
51             add_result = str(float(x) + float(y))
52             string = string.replace(add_str, add_result)
53             string = format_string(string)
54     while re.findall(sub_regu, string):
55         sub_list = re.findall(sub_regu, string)
56         for sub_str in sub_list:
57             numbers = sub_str.split(‘-‘)
58             # 计算开头为(-a-b)这种情况
59             if len(numbers) == 3:
60                 result = 0
61                 for v in numbers:
62                     if v:
63                         result -= float(v)
64             else:
65                 x = numbers[0]
66                 y = numbers[-1]
67                 sub_result = float(x) - float(y)
68             string = string.replace(sub_str,str(sub_result))
69             string = format_string(string)
70     return string
71 #五、主逻辑程序
72 info=True
73 while info:
74     source = input("请输入要计算的公式:")
75     if check_expression(source):
76         strs = format_string(source)
77         while source.count(‘(‘) > 0:
78             # 匹配最里层括号的内容
79             strs = re.search(‘\([^()]*\)‘, source).group()#在这里^是不包含的意思,[^()]+就是不包含括号的所有字符——返回最里面的括号
80             replace_str = mul_div(strs)
81             replace_str = add_sub(replace_str)
82             # 每次计算的结果去掉括号
83             source = format_string(source.replace(strs, replace_str[1:-1]))
84             # else下边的逻辑是计算不带括号的式子
85         else:
86             replace_str = mul_div(source)
87             replace_str = add_sub(replace_str)
88             source = source.replace(source, replace_str)
89     print(source)
90     signal=input("是否继续?y/n")
91     if signal==‘y‘:
92         info=True
93     elif signal==‘n‘:
94         info=False
95 print("已退出,欢迎下次使用!")

难点

1.匹配最里层括号的正则表达式:‘\([^()]*\)‘

2.匹配乘除法及加减法的正则表达式:

乘除——‘\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*‘

加——‘[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*‘

减——‘[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*‘

3.主逻辑的设计

自我总结

此项目为借助已有代码所写;

相比基本语法,代码整体的逻辑设计更重要;

函数的思想还没有完全掌握;

代码的流程逻辑还需要提升;

其实代码也是模块化的,一个模块想清楚了,其他的也相似。

继续努力!

2019年5月7日



原文地址:https://www.cnblogs.com/David0207AlwaysHappy/p/10825671.html

时间: 2024-10-16 01:15:35

Python编写简单计算器(正则表达式应用)的相关文章

用Python编写简单的发红包程序和计算器原理

用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成分为单位 ret = random.sample(range(1,money),num-1) #在最低钱数1分与总钱数之间生成人数减1个数作为数轴的节点 ret.sort() #对列表进行排序 ret.insert(0,0) ret.append(money) for i in range(len(

python编写简单的html登陆页面(3)

1  在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将静态分配数据,建立表格,存放学生信息 2  加载到静态数据 3  html的编写直接在表格里添加一组数据就行了 4  VS Code上面跟前面的后台类似,添加一个content再链接到html就可以了 @app.route('/content')def content(): return render_template('content.html') return 'content.....'

python编写简单的html登陆页面(2)

1  在python编写简单的html登陆页面(1)的基础上在延伸一下: 可以将动态分配数据,实现页面跳转功能: 2  跳转到新的页面:return render_template('home1.html') 3  后台代码如下 4  前端html:

使用Python编写简单的端口扫描器的实例分享【转】

转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/usr/bin/python # Python: 2.7.8 # Platform: Windows # Authro: wucl # Program: 端口扫描 # History: 2015.6.1 import socket, time, thread socket.setdefaulttim

使用Python编写简单网络爬虫抓取视频下载资源

我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎.所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚本语言,没有之中的一个. Python的语言简洁灵活,标准库功能强大.寻常能够用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等.总之我非常喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他.. .很多其它网络编程教程请上网维教程网 由于其强大的字符串处理能力,以及urllib2,c

python 编写简单的setup.py

学习python也已经有一段时间了,发现python作为脚本语言一个很重要的特点就是简单易用,而且拥有巨多的第三方库,几乎方方面面的库都有,无论你处于哪个行业,想做什么工作,几乎都能找到对应的第三方库.别人造好了轮子,我们直接拿过来用,这大大方便了开发,也极大地提升了效率.那么问题来了,有那么多的第三方库,我们如何开发一个属于自己的库呢?其实这是一个比较大的问题,因为开发一个库涉及到的问题很多,比如这个库要用来干嘛,实现什么功能,有没有已经类似的库了,效率如何等.但是这里,我只想抛砖引玉,简单记

使用python编写简单网络爬虫(一)

总算有时间动手用所学的python知识编写一个简单的网络爬虫了,这个例子主要实现用python爬虫从百度图库中下载美女的图片,并保存在本地,闲话少说,直接贴出相应的代码如下: ------------------------------------------------------------------------------------------- #coding=utf-8 # 导入urllib和re模块  import urllib import re # 定义获取百度图库URL的类

python编写简单的html登陆页面(1)

1  html 打开调式效果如下 2  用python后台编写 # coding:utf-8# 从同一个位置导入多个工具,# 这些工具之间可以用逗号隔开,同时导入# render_template渲染母版from flask import Flask,render_template app=Flask(__name__)# 装饰器,路由用来封装链接,同时返回数据@app.route('/index')def index_xxx(): # 导入html # 需要在桌面建立一个templates文件

c#编写简单计算器

刚接触c#,依照惯例,写个简单的计算器,只写了加法,乘法,其他的类似,编辑器用的vs2008 首先打开vs ,新建c#的Windows窗体应用程序,接下来的项目的名称是WindowsFormsApplication2,不是WindowsFormsApplication3. 然后设计计算器的ui界面,比较简单,请谅解... 接下来就是编码,首先要给按钮增加点击事件,代码如下: button1.Click += new EventHandler(Btns_Click);button2.Click +