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退出):

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

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

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


re模块及利用正则进行计算器的设计_第1张图片
待定程序猿

你可能感兴趣的:(re模块及利用正则进行计算器的设计)