Python 正则表达式实现计算器功能


Posted in Python onApril 29, 2017

需求:

用户输入运算表达式,终端显示计算结果

代码:

# !/usr/bin/env/ python3
# -*- coding: utf-8 -*-

"""用户输入计算表达式,显示计算结果"""

__author__ = 'Jack'

import re

bracket = re.compile(r'\([^()]+\)') # 寻找最内层括号规则
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 寻找除法运算规则
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 寻找加法运算规则
sub = re.compile(r'(\d+\.?\d*--\d+\.?\d*)|(\d+\.?\d*-\d+\.?\d*)') # 寻找减法运算规则
c_f = re.compile(r'\(?\+?-?\d+\)?') # 检查括号内是否运算完毕规则
strip = re.compile(r'[^(].*[^)]') # 脱括号规则

def Mul(s):
 """计算表达式中的乘法运算"""
 exp = re.split(r'\*', mul.search(s).group())
 return s.replace(mul.search(s).group(), str(float(exp[0]) * float(exp[1])))

def Div(s):
 """计算表达式中的除法运算"""
 exp = re.split(r'/', div.search(s).group())
 return s.replace(div.search(s).group(), str(float(exp[0]) / float(exp[1])))

def Add(s):
 """计算表达式中的加法运算"""
 exp = re.split(r'\+', add.search(s).group())
 return s.replace(add.search(s).group(), str(float(exp[0]) + float(exp[1])))

def Sub(s):
 """计算表达式中的减法运算"""
 exp = re.split(r'-', sub.search(s).group())
 return s.replace(sub.search(s).group(), str(float(exp[0]) - float(exp[1])))

def calc():
 while True:
  s = input('Please input the expression(q for quit):') # 例:'1+2- (3* 4-3/2+ ( 3-2*(3+ 5 -3* -0.2-3.3*2.2 -8.5/ 2.4 )+10) +10)'
  if s == 'q':
   break
  else:
   s = ''.join([x for x in re.split('\s+', s)]) # 将表达式按空格分割并重组
   if not s.startswith('('): # 若用户输入的表达式首尾无括号,则统一格式化为:(表达式)
    s = str('(%s)' % s)
   while bracket.search(s): # 若表达式s存在括号
    s = s.replace('--', '+') # 检查表达式,并将--运算替换为+运算
    s_search = bracket.search(s).group() # 将最内层括号及其内容赋给变量s_search
    if div.search(s_search): # 若除法运算存在(必须放在乘法之前)
     s = s.replace(s_search, Div(s_search)) # 执行除法运算并将结果替换原表达式
    elif mul.search(s_search): # 若乘法运算存在
     s = s.replace(s_search, Mul(s_search)) # 执行乘法运算并将结果替换原表达式
    elif sub.search(s_search): # 若减法运算存在(必须放在加法之前)
     s = s.replace(s_search, Sub(s_search)) # 执行减法运算并将结果替换原表达式
    elif add.search(s_search): # 若加法运算存在
     s = s.replace(s_search, Add(s_search)) # 执行加法运算并将结果替换原表达式
    elif c_f.search(s_search): # 若括号内无任何运算(类似(-2.32)除外)
     s = s.replace(s_search, strip.search(s_search).group()) # 将括号脱掉,例:(-2.32)---> -2.32

   print('The answer is: %.2f' % (float(s)))
if __name__ == '__main__':
 calc()

运行效果:

Python 正则表达式实现计算器功能

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
20招让你的Python飞起来!
Sep 27 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
Python中turtle库的使用实例
Sep 09 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Python request操作步骤及代码实例
Apr 13 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
Python之基础函数案例详解
Aug 30 Python
python中类变量与成员变量的使用注意点总结
Apr 29 #Python
Python urls.py的三种配置写法实例详解
Apr 28 #Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 #Python
Python 通过pip安装Django详细介绍
Apr 28 #Python
python 使用get_argument获取url query参数
Apr 28 #Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 #Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 #Python
You might like
做一个有下拉功能的留言版
2006/10/09 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
动态创建类实例代码
2009/10/07 Python
python将图片文件转换成base64编码的方法
2015/03/14 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python 获取url中的参数列表实例
2018/12/18 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
linux下进程间通信的方式
2013/01/23 面试题
中间件分为哪几类
2012/03/14 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
2015年公司新年寄语
2014/12/08 职场文书
华清池导游词
2015/02/02 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
超级礼物观后感
2015/06/15 职场文书
会议新闻稿
2015/07/17 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
python APScheduler执行定时任务介绍
2022/04/19 Python