Python使用re实现计算器
re 正则表达式 计算器
海瑞博客-学习python之路•2016-12-01•Python• 59•0•A+ A-
re是一门小型语言
元字符
. 通配符除了\n
^ 以什么开始的匹配
$ 以什么结尾的匹配
* 重复前一个条件,最少0个,[0,∞]
+ 重复前一个条件,最少1个,[1,∞]
? 重复前面的条件,最少0个,最多1个[0,1]
{x} 重复前面的x次,x为数字,{x,y}最少x次,最多y-1次,{x,}最少x次,最多不限
| 或的意思
\ 反斜杠后跟元字符去除特殊功能
\. 就是匹配点.
\+ 匹配+
\\\\ 匹配\ 等于 r“\\"
r是代表原生字符,不需要python转义就传入re
反斜杠后跟普通字符实现特殊功能
\d 代表数字0-9 [0-9]
\D 代表非数字0-9 [^0-9]
\s 代表匹配空白字符[\t\n\r\f\v]
\S 代表匹配非空白字符 [^\t\n\r\f\v]
\w 代表匹配非空白字符[a-zA-Z0-9]
\W 代表匹配非非字母和数字[^a-zA-Z0-9]
\d 代表匹配一个特殊边界,如匹配单词
字符集
[ ]代表字符集
[a,b,c] 匹配a或b或c中任意一个
[a-z] 匹配a到z中的任意小型字母 [A-Za-z0-9]
- 代表什么到什么之间
^取反的意思,非
\ 将特殊符号转换成普通字符
注:字符集内取消元字符的特殊功能(\ ^ -除外)
[a-z,*] 匹配a-z的字母或*号,还有,号
[^a-z] 匹配非a-z的字母的所有
分组
()代表分组
(1|2) 匹配1或2的字符
(?P<id>\w) 匹配一个字母或数字 这个组的名称是ID
(:?\d+) 取消分组的权限
正则表达式方法
findall(规则,字符串) 寻找所有满足规则的元素
search(规则,字符串) 寻找第一个满足规则的元素并返回一个对象,配合group() 显示内容
re.search("","1jkj123asda").group() #不建议这样写,如果没找到会报错
#建议以下方法
a = re.search("","1jkj123asda")
if a:a = a.group()
else:print("没有找到")
search
match(规则,字符串) 只在开始匹配规则,满足返回对象,不满足返回None
split(规则,字符串) 通过规则分割字符串 注:先匹配第一个,并分割,再从第一个分割后的匹配第二个,并分割。。。
sub(规则,新内容,字符串) 通过规则匹配字符串内容,并把匹配结果替换成新内容
compile(规则) 将规则封装一个对象中,下次可以直接用对象查询,不需要输规则
finditer(规则,字符串)将查找的结果成一个迭代器,使用next方法取,每个内容用group再取数
习题:
计算器
要求可以计算+ - * \ ()**算法。
计算公式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
思路:
判断字符串是否包含字母,两个点,括号不相等情况,并去除空白
提取字符串内的最里面的括号,并返回括号内容
传递替换 ++ +- -+ -- *+ /+的操作
传入其他运算模块 ** // 等
传入 乘除模块进行计算 返回计算完毕的结果
传入 加减法模块 计算返回计算结果 返回最终结果
将结果替换括号,重复前2-7面步骤
直到无法检测出字符串内包含的+-*/ 不包含最后结果
注意点:*- /-的问题 负数+正数的问题处理 加减法和乘除法都要按照从左到右计算
- 海瑞博客 www.hairuinet.com
#!/usr/bin/env python
# -*- coding=utf-8 -*-
# Created on: 2016年12月11日
# @author: 郑建文
# blog:www.hairuinet.com
import re, time
def hefaxin(xx):
'''数据合法性'''
b = 0
for i in xx: # 判断
if b < 0:break
if i == "(":b += 1
elif i == ")":b -= 1
zimu = re.search("[a-zA-Z\=]", xx) # 没有字母为空
kh = len(re.findall("\d+\.?\d*[\(]", xx)) # 判断括号是否有 数字(的情况
kh1 = len(re.findall("[()]", xx)) # 判断括号
dian = re.search("(\d+\.\.\d+)", xx) # 判断是否有 ..
if kh1 % 2 == b == kh and dian == zimu: return xx.replace(" ", "")
return 0
def tihfh(xx):
'''符号替换'''
xx = str(xx)
xx = xx.replace("++", "+")
xx = xx.replace("+-", "-")
xx = xx.replace("-+", "-")
xx = xx.replace("--", "+")
xx = xx.replace("*+", "*")
xx = xx.replace("/+", "/")
return xx
def ccf(xx):
'''乘除法'''
if re.search("\(", xx): xx = xx[1:-1] # 去括号
while re.search("[\*\/]",xx):
cenfa = re.search("\d+\.?\d*[\*\/]{1}\-?\d+\.?\d*", xx)
if cenfa:
cenfa = cenfa.group()
if cenfa.count("*") == 1: # 一个乘法
a, b = cenfa.split("*")
xx = xx.replace(cenfa, str(float(a) * float(b)))
elif cenfa.count("*") == 2:
a, b = cenfa.split("**")
xx = xx.replace(cenfa, str(float(a) ** float(b)))
elif cenfa.count("/") == 1:
a, b = cenfa.split("/")
xx = xx.replace(cenfa, str(float(a) / float(b)))
elif cenfa.count("/") == 2:
a, b = cenfa.split("//")
xx = re.sub(cenfa, str(float(a) // float(b)), xx)
else:
return xx
return xx
def jjf(xx):
'''加减法,按匹配顺序计算'''
if "(" in xx: xx = xx[1:-1] # 去括号
while re.search("\d+\.?\d*[\+\-]\d+\.?\d*",xx):
findret = re.search("[\-]?\d+\.?\d*[\+\-]\d+\.?\d*", xx)
if findret:
findret = findret.group()
if re.search("\d+\.?\d*\+\d+\.?\d*",findret): # 加法
a, b = findret.split("+")
xx = xx.replace(findret, str(float(a) + float(b)))
elif re.search("\d+\.?\d*\-\d+\.?\d*",findret): # 减法
a, b = findret.split("-")
xx = xx.replace(findret, str(float(a) - float(b)))
else:return xx
return xx
def kuohao(xx):
'''寻找括号'''
xx = re.search("(\([^()]+\))", xx)
if xx: return xx.group() # 找到就返回找到结果
return 0 # 没找到返回0
if __name__ == '__main__':
while True:
jishuan = input("请输入公式,保留2位小数。\n绿色为正确,红色结果错误!\n>>>")
db = hefaxin(jishuan) # 合法性判断
if db: # 返回正确执行精算
while db.count("(") > 0: # 循环一直有括号的
kh = kuohao(db) # 寻找括号
db = db.replace(kh, str(jjf(ccf(tihfh(kh))))) # 替换括号
else: # 无括号的情况
ret = jjf(ccf(tihfh(db)))
if "+" in ret: ret = ret[1:] # 取正数前面符号
while len(re.findall("\d+\.?\d*[\+\-\*\/]+\d+\.?\d*",ret)) > 0:
ret = jjf(ccf(tihfh(ret)))
if eval(jishuan) == float(ret):s = 32 # 正确就显示绿色
else:s = 31 # 错误就是红色
print("\33[%d;1m%s=%.2f\n\33[1m" % (s, jishuan, float(ret)))
else:print("\33[31;1m程序不合法,无法计算!\33[1m\n\n")
# 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
#jishuan = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
# 2*3*4*-1=6.0*-4.0计算器代码
Python使用re实现计算器的更多相关文章
- 教学项目之-通过Python实现简单的计算器
教学项目之-通过Python实现简单的计算器 计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...
- 【Python 20】BMR计算器4.0(异常处理)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
- python实现简单的计算器功能
如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...
- Python基础入门-实现计算器多种姿势
在Python中,虽然定义一个函数只需要def关键字,但是他能实现多种功能和用途,比如今天我们讲解的这几种方式.如何使用函数实现一个计算器的功能呢?当然,实现计算器的方式有很多种,我们举几个比较典型的 ...
- Python带括号的计算器
带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走 我会努力加油 将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...
- 用python实现简单的计算器(加减乘除小括号等)
需求:实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ...
- python正则实现简单计算器
利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...
- python + PyQt5 实现 简易计算器
忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...
- 【Python 19】BMR计算器3.0(字符串分割与格式化输出)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
随机推荐
- 关于lab4实验git+近期出国手续办理
1.下载mit jos lab4时遇到问题(关于git操作,使用,还需进一步理解) 遇到的问题 出现未合并(merge)完全的问题,操作:git add kern/init.c 之后在确认提交 方法二 ...
- .net如何自定义config配置文件节点
本文转载:http://www.cnblogs.com/lori/archive/2013/04/03/2997617.html 对于小型项目来说,配置信息可以通过appSettings进行配置,而如 ...
- 【转】http响应状态代码含义及跳转的类型
转自:http://www.west263.com/info/html/caozuoxitong/FreeBSD/20090513/123479.html 当我们在因特网遨游的时候,每天都会看到诸如5 ...
- DirectoryEntry 活动目录的使用
public class DirectoryHelper { public static string DomainName = System.Environment.UserDomainName; ...
- 让delphi程序不受WINDOWS日期格式的影响
http://www.cnblogs.com/hnxxcxg/archive/2013/01/30/2882672.html 如果WINDOWS系统的短日期格式为“yyyy/m/d”,执行下面的代码会 ...
- [Javascript] Chaining the Array map and filter methods
Both map and filter do not modify the array. Instead they return a new array of the results. Because ...
- [置顶] asp.net(c#)中相对路径(虚拟路径)和物理磁盘路径的转换
物理路径就是磁盘路径,也就是说是在磁盘上的位置,虚拟路径也就是web页面上的路径,是相对于应用程序而言的 /// <summary> /// 将物理路径转换成相对路径 /// </s ...
- log4j中存在日志无法打印问题解决
我在项目中配置双数据中心,原来类包名称前最都是一致的,后来由于项目的需要根据数据来源命名不同的类包名称,这个导致一个问题,sql语句运行无法正常打印出来,提示以下内容: log4j:WARN No a ...
- java strtus2 注解配置入门(一)
因为工作的原因,所以接触到一些项目,有的项目虽然看着能有跟着做,可是具体里面的框架是别人配置的,具体框架还是不是非常的了解,所以这里在看一下我学到的 一点关于struts2中注解开发的一点点. 直接代 ...
- java ssm框架入门(一)面向接口编程
因为工作上用到spring + strtus2 + mybatis ,所以开始学习下这个框架. 这里用到的是MySQL数据库 首先从web.xml 开始 <?xml version=" ...