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的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
python处理html转义字符的方法详解
Jul 01 Python
python 计算文件的md5值实例
Jan 13 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
在python中bool函数的取值方法
Nov 01 Python
python用match()函数爬数据方法详解
Jul 23 Python
tensorflow 只恢复部分模型参数的实例
Jan 06 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
为什么称python为胶水语言
Jun 16 Python
详解Pycharm与anaconda安装配置指南
Aug 25 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 动态添加记录
2009/03/10 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
php session_decode函数用法讲解
2019/05/26 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python优先队列实现方法示例
2017/09/21 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
python使用建议与技巧分享(一)
2020/08/17 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
个人求职简历的自我评价范文
2013/10/09 职场文书
实习生个人找工作的自我评价
2013/10/30 职场文书
总账会计岗位职责
2014/03/13 职场文书
师德师风建设方案
2014/05/08 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
详解python网络进程
2021/06/15 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers