首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python——四则表达式(正则表达式的应用)

终于,忙碌的周末结束了,功夫不负有心人,总算写了出来

依稀记得,n年前按键精灵等级考试时的题目:写一个四则运算的代码。当时其实离六级认证水平还有一定差距,愣是写了半个下午,才把不带括号的加减乘除给做出来(20分的题目得了10分,还是挺庆幸的),要知道当时压根不知道什么是正则表达式,识别加减号都是用字符查找一个个进行的。后来我还专门研究了一下,发现只这个识别拆分括号,就有一大套看着很牛逼的理论,吓得我这个题目就一直没敢继续下去

好了,直接上需求和代码:

开发一个简单的python计算器: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后, 必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致。

最后我又加了一个幂运算的功能

代码语言:javascript
复制
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
# __author__: Ed Frey
# date:2018/8/12
import re
source = '3**(-5) - 2 * ( (60-30**(-2) +(-40/5) * (9-2*(-5)/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
def check(s):
    flag = True
    if re.findall('[a-zA-Z]',s):
        print('Invalid input ,don\'t input letters')
        flag = False
    return flag
def format(string):
    string = string.replace('++', '+')
    string = string.replace('+-', '-')
    string = string.replace('-+', '-')
    string = string.replace('--', '+')
    string = string.replace('*+', '*')
    string = string.replace('/+', '/')
    string = string.replace(' ', '')
    return string
def arithmetic(expression_js):
    while True:
        ret = re.search('[\-]?[0-9.]+\*\*+[\-]?[0-9.]+', expression_js)     #去括号后的表达式查找:是否含有**幂运算
        if ret:
            string0 = ret.group()
            string = re.findall('[\-]?[0-9.]', string0)                     #匹配幂运算算式中的数值
            result = float(string[0]) ** float(string[1])
            expression_js = expression_js.replace(string0, '+' + str(result))
            expression_js = format(expression_js)
            pass
        else:
            ret = re.search('[\-]?[0-9.]+[*/]+[\-]?[0-9.]+',expression_js) #去掉括号后的表达式查找:数值与数值的乘除法算式
            if ret:#如果有乘除法
                string0 = ret.group()
                string = re.findall('[\-]?[0-9.]+|\*|\/',string0)  #匹配所有的数值(含负数)和乘除号,列表3个元素,第二个是乘除号
                if string[1] == '*':
                    result = float(string[0])*float(string[2])
                elif string[1] == '/':
                    result = float(string[0])/float(string[2])
                expression_js = expression_js.replace(string0, '+'+str(result))
                expression_js = format(expression_js)
            else: #如果没有乘除法
                ret = re.search('[\-\+]?[0-9.]+[\+\-][0-9.]+', expression_js)  #
                if ret:
                    string0 = ret.group()
                    string = re.findall('[\-]?[0-9.]+', string0)    #加减法,将加号、减号转为数字的正负值
                    result = 0
                    for i in string:                                    #将纯加减法算式中的正负值求和
                        result =float(result) + float(i)
                    expression_js = expression_js.replace(string0, str(result))
                    expression_js = format(expression_js)
                else:
                    break
    return expression_js
while True:
    flag = check(source)
    if flag == True:
        ret = format(source)
        parentheses = re.search('\([^()]+\)',ret)   #检测表达式是否有括号,取最里层括号
    else:
        break
    if parentheses:
        expr_par = parentheses.group()
        expr_result2 = arithmetic(expr_par[1:-1])   #将取括号内的算式进行加减乘除运算
        ret = ret.replace(expr_par,expr_result2)
        source = format(ret)
        print(f'The processing is {source}')
    else:
        source = format(ret)
        expr = arithmetic(source)                   #没括号的直接运算加减乘除
        print(f'The result is {expr}')
      break
print(eval(source))

反正就这么硬杠,我并没有把加减乘除幂写成多个函数。只要没有括号,就用
arithmathtic()函数直接进行循环运算(if了好多层,但其实也还好)。括号
里面的值如果是负数,也是硬拆括号,使用format()函数进行化解,像“*-”
“**-”这些符号format()化解不了的,可直接把里面的减号跟数字合为一体,
视为负数进行运算。而纯加减法中,也是这个思想,将所有的加减号看作是
数字的正负号,直接进行遍历求和
先这样吧,回头如果发现犀利的代码,再转载过来分享给大家。
举报
领券