re 正则表达式 计算器

海瑞博客-学习python之路•2016-12-01•Python• 59•0A+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) )

思路:

  1. 判断字符串是否包含字母,两个点,括号不相等情况,并去除空白

  2. 提取字符串内的最里面的括号,并返回括号内容

  3. 传递替换 ++  +-  -+  --  *+  /+的操作

  4. 传入其他运算模块 **  // 等

  5. 传入 乘除模块进行计算  返回计算完毕的结果

  6. 传入 加减法模块 计算返回计算结果 返回最终结果

  7. 将结果替换括号,重复前2-7面步骤

  8. 直到无法检测出字符串内包含的+-*/  不包含最后结果

  9. 注意点:*-   /-的问题   负数+正数的问题处理  加减法和乘除法都要按照从左到右计算

  10. 海瑞博客 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实现计算器的更多相关文章

  1. 教学项目之-通过Python实现简单的计算器

    教学项目之-通过Python实现简单的计算器   计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...

  2. 【Python 20】BMR计算器4.0(异常处理)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...

  3. python实现简单的计算器功能

    如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...

  4. Python基础入门-实现计算器多种姿势

    在Python中,虽然定义一个函数只需要def关键字,但是他能实现多种功能和用途,比如今天我们讲解的这几种方式.如何使用函数实现一个计算器的功能呢?当然,实现计算器的方式有很多种,我们举几个比较典型的 ...

  5. Python带括号的计算器

    带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走  我会努力加油  将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...

  6. 用python实现简单的计算器(加减乘除小括号等)

    需求:实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ...

  7. python正则实现简单计算器

    利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...

  8. python + PyQt5 实现 简易计算器

    忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...

  9. 【Python 19】BMR计算器3.0(字符串分割与格式化输出)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...

随机推荐

  1. Linux下安装ACE

      ACE 5.6下载地址:http://download.dre.vanderbilt.edu/ 方法一: 1. 解开ACE-install.sh文件    tar –zxvf ACE-5.6.ta ...

  2. WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)

    在写次文前先不得不说下网上的其他wpf的DataGrid绑定ComboBox的方式,看了之后真是让人欲仙欲死. 首先告诉你一大堆的模型,一大堆的控件模板,其实或许你紧紧只想知道怎么让combobox怎 ...

  3. iOS之正则表达式的使用

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  4. C#基础篇02

    首先:一个完整的方法是包括两部分的,代码和注释!!!! 程序的调试: 3:设置断点:  断点之前的程序已经确保正确,可是在断点后的部分可能出现错误,所以设置完断点后,直接点击启动,然后按F11逐步棸的 ...

  5. Hessian

    一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . ...

  6. sublime text 3快捷键设置

    sublime text 3  v-3103默认快捷键设置 [ { "keys": ["ctrl+shift+n"], "command": ...

  7. (转)MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet

    1.安装准备 1).下载安装MyEclipse2014,这已经是最新版本. 2).下载Tomcat 官网:http://tomcat.apache.org/ 我们选择8.0: http://tomca ...

  8. Ajax编程技术

    AJAX:”Asynchronous JavaScript and XML” 中文意思:异步JavaScript和XML. 指一种创建交互式网页应用的网页开发技术. 不是指一种单一的技术,而是有机地利 ...

  9. 关于dialog引起的 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView not attached to window manager 错误的分析

    在跑Monkey测试的时候出现了一个比较特别的问题,先来看看Log: // CRASH: com.meizu.media.painter (pid 12491) // Short Msg: java. ...

  10. win向linux传文件

    使用pscp.exe即可. 下载pscp.exe(http://pan.baidu.com/s/1jG6zmx4) 复制到windows/system32目录下即可. 然后可在cmd命令行下使用psc ...