import re

# 格式化字符串函数(消除一些错误的格式)
def format_string(string):
# 一系列的替换语句
string = string.replace("--", "-")
string = string.replace("-+", "-")
string = string.replace("++", "+")
string = string.replace("*+", "*")
string = string.replace("/+", "/")
string = string.replace(" ", "-") return string # 检查函数(检查输入的表达式是否合法)
def chek_expression(string):
check_result = True # 标志位 if not string.count("(") == string.count(")"): # 检查括号是否完整
print("输入错误,未匹配到完整括号!")
check_result = False if re.findall('[a-pr-z]+', string.lower()): # 检查是否包含字母
print("输入错误,包含非法字符!")
check_result = False return check_result # 加减法函数
def add_minus(string): add_regular = r'[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*' # 定义一个匹配的规则
sub_regular = r'[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*' # 同上
# 注解:[\-]? 如果有负号,匹配负号; \d+ 匹配最少一个数字; \.? 是否有小数点,有就匹配;\d* 是否有数字有就匹配
# \+ 匹配一个加号; [\-]?\d+\.?\d* 这几个同上 # 加法
while re.findall(add_regular, string): # 按照regular规则获取一个表达式,用while循环,把所有加法都算完 add_list = re.findall(add_regular, string)
for add_stars in add_list:
x, y = add_stars.split('+') # 获取两个做加法的数(以+号作为分割对象),分别赋给x和y
add_result = '+' + str(float(x) + float(y))
string = string.replace(add_stars, add_result) # 替换
string = format_string(string) # 减法
while re.findall(sub_regular, string): # 用while循环,把所有减法都算完 sub_list = re.findall(sub_regular, string)
for sub_stars in sub_list:
x, y = sub_stars.split('-') # 获取两个做减法的数(以-号作为分割对象),分别赋给x和y
sub_result = '+' + str(float(x) + float(y))
string = string.replace(sub_stars, sub_result) # 替换
string = format_string(string) return string # 乘、除法函数
def multiply_divide(string):
regular = r'[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*' # 定义一个匹配的规则regular while re.findall(regular, string):
expression = re.search(regular, string).group() # 按照regular规则获取一个表达式 # 如果是乘法
if expression.count('*') == 1:
x, y = expression.spilt('*')
mul_result = str(float(x) * float(y))
string = string.replace(expression, mul_result) # 计算结果替换原表达式
string = format_string(string) # 格式化 # 如果是除法
if expression.count('/') == 1:
x, y = expression.spilt('/')
div_result = str(float(x) / float(y))
string = string.replace(expression, div_result)
string = format_string(string) # 格式化 # 如果是阶乘
if expression.count('**') == 1:
x, y = expression.spilt('**')
pow_result = 1
for i in range(int(y)):
pow_result *= int(x)
string = string.replace(expression, str(pow_result))
string = format_string(string) # 格式化 return string # 主程序
while True:
source = input("请输入表达式:") # 输入要计算的式子 if source == "Q": # 该判断语句只能写在前面,写后面会报错
exit() # 如果输入是Q,退出 elif chek_expression(source):
print("eval result: ", eval(source)) # eval() 是把其他类型转换为字符串
sourse = format_string(source) if source.count("(") > 0:
stars = re.search(r'\([^()]*\)', source).group() # 去括号,得到括号里的字符串
replace_stars = multiply_divide(stars) # 将括号的表达式进行乘除运算
replace_stars = add_minus(stars) # 将乘除的结果进行加减运算
source = format_string(source.replace(stars, replace_stars)) # 用计算结果替换括号字符串 # 没有括号直接进行运算
else:
replace_stars = multiply_divide(source) # 乘除运算
replace_stars = add_minus(source) # 加减运算
source = source.replace(source, replace_stars)

python 简易计算器(只能计算加减乘除和括号)的更多相关文章

  1. C语言实现简易计算器(可作加减乘除)

    C语言实现简易计算器(加减乘除) 计算器作为课设项目,已完成答辩,先将代码和思路(注释中)上传一篇博客 已增添.修改.整理至无错且可正常运行 虽使用了栈,但初学者可在初步了解栈和结构语法后理解代码 # ...

  2. python 简易计算器

    import tkinter import tkinter.messagebox import math ''' 波波版计算器可实现的功能 1.能进行简单的加减惩处 2.能进行开根号操作 3.能进行后 ...

  3. python简易计算器

    import re """ 过程:(最内部的括号->先乘除,替换->整理表达式->加减)->替换 """ def m ...

  4. 用python实现简单的计算器(加减乘除小括号等)

    需求:实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ...

  5. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  6. python + PyQt5 实现 简易计算器

    忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...

  7. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  8. java实现一个简单的数学表达式分析器(加减乘除和括号)

    1.使用此分析器需要输入两个量: String str1=运算符号有前后有空格的数学表达式(如 1 + 2 *  ( 3+1)  - 5 #),并在最后添加‘#’字符作为结束标志: String st ...

  9. Qt、C++ 简易计算器

    Qt.C++实现简易计算器: 以下内容是我实现这个简易计算器整个过程,其中包括我对如何实现这个功能的思考.中途遇到的问题.走过的弯路 整个实现从易到难,计算器功能从简单到复杂,最开始设计的整个实现步骤 ...

随机推荐

  1. 笔记-JavaWeb学习之旅3

    数据库的设计 1.多表之间的关系 一对一 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键 一对多 在多的一方建立外键指向一的一方建立主键 多对多 多对多关系实现需要借助第三张中间表.中间表 ...

  2. poj2893 M*N puzzle 【n*m数码问题小结】By cellur925

    题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...

  3. [NewTrain 10][poj 2329]Nearest Number - 2

    题面: http://poj.org/problem?id=2329 题解: 这题有很多做法 1. 搜索 复杂度$O(n^4)$ 但是实际上远远达不到这个复杂度 所以可以通过 2. 对于每一个格子,我 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. 喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE

    官方题解:http://www.cnblogs.com/qscqesze/p/6480284.html 哗啦啦村的刁难(1) 描述 哗啦啦村作为喵哈哈村的对头,于是他们准备给喵哈哈村一个好看. 哗啦啦 ...

  6. linux查找命令(find)

    linux查找命令(find) 命令格式: find [目录] [选项] [选项的条件] 选项: -name:文件名称查找 -size:文件的大小来查找 -perm:文件的权限来查找 ①根据文件的名称 ...

  7. 1-6static关键字

    static的作用? static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在方法区里面,因此,静态变量在类加载阶段赋值,并且只赋值一次.请看例1 static可以修饰 ...

  8. php 缩略图

    <!DOCTYPE html><!-- HTML5表单 --><form method="post" action="" enct ...

  9. MySQLDump在使用之前一定要想到的事情 [转载]

    转载于:http://blog.itpub.net/29254281/viewspace-1392757/ MySQLDump经常用于迁移数据和备份. 下面创建实验数据,两个数据库和若干表create ...

  10. java学习第二章