#!/usr/bin/env python

# -*- coding:utf-8 -*-

#Author:QiFeng Zhang

import re

__Author__ = "Faker"

'''计算表达式字符串'''

bracket = re.compile(r"\([^()]+\)") #查找最内层括号

div = re.compile(r"(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)") #查找除法运算

mul = 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+\.?\d*\)?") #查找括号内是否运算完毕

strip = re.compile(r"[^(].*[^)]") #去除括号

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 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 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 = sub.search(s).group() #去除减法表达式

if exp.startswith('-'): #如果表达式形如:-2.2-1.2;需变换为:-(2.2+1.2)

exp = exp.replace('-', '+') #将-号替换为+号;+2.2+1.2

res = Add(exp).replace('+', '-') #调用Add运算,将返回值+3.4变为-3.4

else:

exp = re.split(r'-',exp)

res = str(float(exp[0]) - float(exp[1]))

return s.replace(sub.search(s).group(),res)

def calc():

while True:

s = input('plase input the key(q for quit)>>>').strip()

if s == 'q': #如果输入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.replace('--','+') #将表达式中的--替换成+

s_search = bracket.search(s).group() #查找最内层括号,将括号内容取出

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): #加减乘除都不含,判断是否有括号

s = s.replace(s_search,strip.search(s_search).group()) #对最终结果执行去括号操作

print('The answer is %.2f'%(float(s)))

if __name__ == "__main__":

calc()

python数学公式识别_python用re正则表达式实现数学公式计算相关推荐

  1. python模型预测_python:目标检测模型预测准确度计算方式(基于IoU)

    训练完目标检测模型之后,需要评价其性能,在不同的阈值下的准确度是多少,有没有漏检,在这里基于IoU(Intersection over Union)来计算. 希望能提供一些思路,如果觉得有用欢迎赞我表 ...

  2. python 数学公式识别_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  3. python小说文本挖掘_Python小说文本挖掘正则表达式分析案例

    原文链接:http://tecdat.cn/?p=5673 约瑟夫·海勒的<第二十二条军规>是我最喜欢的小说.我最近读完了 ,并喜欢整本书中语言的创造性使用和荒谬人物的互动.对于我的可视化 ...

  4. python人头识别_python+opencv实现人头检测

    python+opencv实现人头检测 python+opencv实现人头检测 前段时间琢磨了下人头检测这个功能,现在有了初步的认知和体会,下面开始讲下我在实现人头检测过程中遇到的坑和解决方法. 环境 ...

  5. python信用卡识别_python opencv实现信用卡的数字识别

    本项目利用python以及opencv实现信用卡的数字识别 前期准备 导入工具包 定义功能函数 模板图像处理 读取模板图像 cv2.imread(img) 灰度化处理 cv2.cvtColor(img ...

  6. python 图片识别_python识别图片文字

    滑稽研究所 python识别图片文字 哈喽,大家好呀,我是滑稽君.大家在写论文时可能经常碰到无法复制文字的文章.明明找到了需要的内容却无法直接复制使用,这让我们十分苦恼.那么本期滑稽君就告诉大家如何使 ...

  7. python 图片识别_Python—识别图片中的文字

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

  8. python智能识别_Python人工智能识别文字内容(OCR)

    环境准备 安装pytesseract和PIL安装这两个包可以借助pip命令行安装 pip install PIL pip install pytesseract 安装识别引擎tesseract-ocr ...

  9. python 分词 识别_python分词如何实现新词识别

    2013-12-19 回答 # -*- coding: utf-8 -*- import jieba ''''' created on 2015-11-23 ''' def word_split(te ...

最新文章

  1. java并发之同步辅助类CyclicBarrier和CountDownLatch
  2. 开发日记-20190816 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 24
  3. python-子类和派生、继承
  4. Double 与 Float 的值的比較结果
  5. RealARM210 V3.2硬件版本 nand flash地址分配明细
  6. <深入剖析Tomcat>摘抄
  7. 使用c:forEach 控制5个换行
  8. 【linux命令总结】——后续用到的内容持续补充和更新
  9. php mysql cpu100_解决mysql占用cpu资源100%的问题_MySQL
  10. RS请求错误之RSV-BBP-0028
  11. 一起谈.NET技术,ASP.NET2.0服务器控件之类型转换器
  12. Joomla源代码解析(十九) JController
  13. NetBeans Weekly News 刊号 # 152 - Jun 15, 2011
  14. jQuery EasyUI快速入门01
  15. 中国石油大学--生活学习简易FAQ
  16. 五大主流浏览器内核的源起以及国内各大浏览器内核总结
  17. SECS/GEM概念
  18. Android Dialog宽度设置固定大小
  19. 教师办公用计算机使用管理制度,教师办公室计算机使用规章制度
  20. 我是如何从流水线工人到程序员?(2008-2018)

热门文章

  1. 如何做好积分商城运营?
  2. python直角坐标转极坐标_Python在OpenCV里实现极坐标变换功能
  3. 通过css和js实现流星雨效果
  4. 百度地图集成,经纬度返回 4.9e-324
  5. vmware ThinApp 4.01 and Workstation 6.5.1 sn
  6. 产品生命周期,鸿沟理论和CNCF项目孵化
  7. linux 备份信息查看器,linux 全新的备份神器 Duplicity
  8. WIN10 禁用 credentital guard Device Guard或Credential Guard与Workstation不兼容
  9. 俞敏洪老师谈英语单词记忆方法——转
  10. Linux登录mysql时 密码正确登录不进去,没有密码却能登进去