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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
python发送邮件脚本
May 22 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
Python matplotlib实时画图案例
Apr 23 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
python Matplotlib数据可视化(1):简单入门
Sep 30 Python
常用的Python代码调试工具总结
Jun 23 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 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(3)
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
探讨php中header的用法详解
2013/06/07 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
Javascript this指针
2009/07/30 Javascript
javascript 面向对象继承
2009/11/26 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
react 生命周期实例分析
2020/05/18 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
python socket网络编程之粘包问题详解
2018/04/28 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
python数据挖掘需要学的内容
2019/06/23 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
银行贷款委托书范本
2014/10/11 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
工作保证书怎么写
2015/02/28 职场文书
九年级数学教学反思
2016/02/17 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
Python编程super应用场景及示例解析
2021/10/05 Python
海弦WR-800F
2022/04/05 无线电
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js