Python-正则表达式实现计算器功能
需求:
用户输入运算表达式,终端显示计算结果
源代码:
# !/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 = 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('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 - 6 ] 正则表达式实现计算器功能
要求:禁止使用eval函数.参考网上代码如下: #!_*_coding:utf-8_*_ """用户输入计算表达式,显示计算结果""" im ...
- Python+Tkinter 实现计算器功能
#=================================================================================== import tkinter ...
- python 实现一个计算器功能
#s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' #第 ...
- Python 正则实现计算器
# !/usr/bin/env/ python3 # -*- coding: utf-8 -*- """用户输入计算表达式,显示计算结果""" ...
- 利用PYTHON设计计算器功能
通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- 第11.13节 Python正则表达式的转义符”\”功能介绍
为了支持特殊元字符在特定场景下能表示自身而不会被当成元字符进行匹配出来,可以通过字符集或转义符表示方法来表示,字符集表示方法前面在<第11.4节 Python正则表达式搜索字符集匹配功能及元字符 ...
- 第11.4节 Python正则表达式搜索字符集匹配功能及元字符”[]”介绍
Python正则表达式字符集匹配表示是指搜索一个字符,该字符在给定的一个字符的集合中.元字符'['和']'是用于组合起来定义匹配字符集,匹配模式中使用 '['开头,并使用']'结尾来穷举搜索的字符可能 ...
随机推荐
- JS 与 OC 交互
WebView与JS的几种交互 IOS中 使用JavaScriptCore 实现OC与JS的交互 JavaScriptCore 使用
- MODBUS协议相关代码(CRC验证 客户端程序)
Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用的是主从通讯技术,即由主设备主 ...
- PHP 数组与CSV文件互转
项目说明 数组导出CSV,ZIP文件,CSV,ZIP文件还原数组(Array export file,file restore array)适用于导入导出会员,商品信息注意:读取中文文件名文件.数据时 ...
- python学习,day3:示例,进度条
# coding=utf-8 # Author: RyAn Bi import sys,time for i in range(50): sys.stdout.write("#") ...
- 128th LeetCode Weekly Contest Pairs of Songs With Total Durations Divisible by 60
In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pairs of s ...
- iOS开发苹果内购的介绍与实现
1.iOS开发苹果内购的介绍 1.1 介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝 ...
- pip和conda安装源更改
pip和conda安装源更改 python模块安装,使用国内源可以提高下载速度. pip源更改: pip源有好几个,我一直用的清华的pip源,它5分钟同步一次. 临时使用: pip 后加参数 -i h ...
- github创建本地库后关联远程库
在进行新项目开发时,有时候并不一定先创建远程库,而是先在本地将项目创建,到一定阶段后再与远程库关联.下面步骤解决本地库与远程库在这种情形. 1. 初始化本地库,既然项目已经创建了,相信这个也已经知道了 ...
- Ubuntu 18.04上搭建FTP服务器
1.准备工作需要安装并运行的Ubuntu Server 18.04系统.当然还需要一个具有sudo权限的账号. 2.安装VSFTPVSFTP程序位于标准存储库中,因此可以使用单个命令删除安装.打开终端 ...
- [转载]java.ByteArrayInputStream与ByteArrayOutputStream再次理解
一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutpu ...