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 相关文章推荐
跟老齐学Python之关于循环的小伎俩
Oct 02 Python
Unicode和Python的中文处理
Mar 19 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
python中join()方法介绍
Oct 11 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
python scrapy爬虫代码及填坑
Aug 12 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
Python OpenCV读取显示视频的方法示例
Feb 20 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
PHP如何抛出异常处理错误
2011/03/02 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
简明json介绍
2008/09/28 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
Python日志处理模块logging用法解析
2020/05/19 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
SQL语言面试题
2013/08/27 面试题
金秋助学感谢信
2015/01/21 职场文书
捐款通知怎么写
2015/04/24 职场文书
工作会议简报
2015/07/20 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL