re模块及利用正则进行计算器的设计

简介

正则表达式本身是一种小型的、高度专业化的编程语言,在python中被集成在re模块中,方便pythoner使用。

字符含义

元字符

#   准备知识  re正则表达式
# 元字符 . * $ ^ ( ) [ ] \ | + ?{ }

# .表示任意一个字符
# ret = re.findall('m.....r', 'monster') # monster
# print(ret)

# *修饰其前一个字符,可表示零个至多个
# ret = re.findall('ter*', 'mmmonsterrrr')  # terrrr
# print(ret)

# \ 转义字符,使后一个字符改变原来的意思

# + 和*的功能类似,匹配一个到多个
# ret = re.findall('ter*', 'mmmonste')  # te
# print(ret)

# ^ 匹配字符串开头。在多行模式中匹配每一行的开头
# ret = re.findall('^mmmo', 'mmmonstemmmo')  # mmmo
# print(ret)

# $匹配字符串末尾,在多行模式中匹配每一行的末尾
# ret = re.findall('m..e$', 'monekmioe')  # mioe
# print(ret)

# ?修饰前一个字符表示0个或1个,本身不占位置
# ret = re.findall('abc?', 'abc')     # abc
# print(ret)
# ret = re.findall('abc?', 'ab')     # ab
# print(ret)

# | 或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式
# ret = re.findall('abc|def', 'abcde')    # abc
# print(ret)
# ret = re.findall('abc|def', 'bcdef')    # def
# print(ret)

# [ ] 字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
# 所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。
# ret = re.findall('a[bc]e', 'abed')     # abe
# print(ret)
# ret = re.findall('a[bc]e', 'aced')     # ace
# print(ret)

# { }  {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次
# ( )   被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1.分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效

这里讲一下\(反斜杠)的作用:

  • 去除特殊含义,反斜杠后加元字符,会将元字符恢复成普通字符。
  • 实现特殊功能,反斜杠后加普通字符,实现特殊功能,当然只有一部分字符具有这样的功能(预定义字符)
  • 引用序号对应的字组所匹配的字符串。

预定字符集

# \d 数字[0-9]
# \D 非数字[^\d]
# \s 匹配任意空白字符:[<空格>\t\r\n\f\v]
# \S 非空白字符[^\s]
# \w 匹配包括下划线在内的任何字字符:[A-Za-z0-9_]
# \W 匹配非字母字符,即匹配特殊字符
# \A 仅匹配字符串开头,同^
# \Z 仅匹配字符串结尾,同$
# \b 匹配\w和\W之间,即匹配单词边界匹配一个特殊边界(比如单词和单词边界
# \B [^\b]

正则小应用

能进行加减乘除以及括号优先级运算的计算器
代码如下

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('-'):
        exp = exp.replace('-', '+')
        res = Add(exp).replace('+', '-')
    else:
        exp = re.split(r'-', exp)
        res = str(float(exp[0])-float(exp[1]))
    return s.replace(sub.search(s).group(), res)


def func():
    print("******---欢迎使用加减乘除计算器---******\n")
    while True:
        s = input("请键入需要计算的式子(q退出):")
        if s == 'q':
            break
        else:
            s = ''.join([x for x in re.split('\s+', s)])  # 删除字符串中的空格便于计算
            if not s.startswith('('):
                # print(s)
                s = str('(%s)' % s)    # 如果表达式首位无括号,则格式化表达式为:(表达式),方便最后一步计算
                # print(s)
                while bracket.search(s):    # 表达式存在括号,我们已经将表达式格式化为(表达式)
                    s = s.replace('--', '+')
                    s_temp = bracket.search(s).group()
                    if div.search(s_temp):   # 若除法运算存在(必须放在乘法之前)
                        s = s.replace(s_temp, Div(s_temp))
                    elif mul.search(s_temp):
                        s = s.replace(s_temp, Mul(s_temp))
                    elif sub.search(s_temp):
                        s = s.replace(s_temp, Sub(s_temp))
                    elif add.search(s_temp):
                        s = s.replace(s_temp,Add(s_temp))
                    elif c_f.search(s_temp):  # 若括号内无任何运算(类似(-2.32)除外)
                        s = s.replace(s_temp, strip.search(s_temp).group())
                    # print(s)
                print('计算结果为: %.2f' % (float(s)))

# class Main():
#     def __init__(self):
#         pass


if __name__ == '__main__':
    func()

运行测试结果:

******---欢迎使用加减乘除计算器---******

请键入需要计算的式子(q退出):1+(2*(3+4)-4)/3
(1+(2*(7.0)-4)/3)
(1+(2*7.0-4)/3)
(1+(14.0-4)/3)
(1+(10.0)/3)
(1+10.0/3)
(1+3.3333333333333335)
(4.333333333333334)
4.333333333333334
计算结果为: 4.33
请键入需要计算的式子(q退出):

重要的事说三遍,一定要检查正则匹配规则,一定要检查正则匹配规则,一定要检查正则匹配规则。

如有错误之处,欢迎斧正。

欢迎关注微信公众号 待定程序猿
不定期更新自己学习总结


待定程序猿
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容