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 命令行非阻塞输入的小例子
Sep 27 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
Python if语句知识点用法总结
Jun 10 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
Python字典底层实现原理详解
Dec 18 Python
Django框架配置mysql数据库实现过程
Apr 22 Python
Python接口测试结果集实现封装比较
May 01 Python
python编写实现抽奖器
Sep 10 Python
python调用摄像头的示例代码
Sep 28 Python
python中最小二乘法详细讲解
Feb 19 Python
Python Numpy库的超详细教程
Apr 06 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代码
2010/02/16 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
PHP7修改的函数
2021/03/09 PHP
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
python处理json数据中的中文
2014/03/06 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python松散正则表达式用法分析
2016/04/29 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
python实现LRU热点缓存及原理
2019/10/29 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
如何用Python 加密文件
2020/09/10 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
家长写给老师的建议书
2014/03/13 职场文书
会计电算化专业求职信
2014/06/10 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技