【Python】简单计算器实现(一)

解决思路:首先使用正则表达式,把输入的式子中的数字和运算符全部分割开来,此过程中需要判断 “-” 是负号还是减号。

定义函数:def formula_format(formula)

步骤一:利用 sub 函数去除输入的式子 formula 中的空格。

formula = re.sub(' ', '', formula)

步骤二:将式子中形为 “-数字” 的内容与其余内容分割开来,并将各内容放入列表 formula_list 中。正则表达式为 “(-\d+\.{0,1}\d*)”,考虑负数 -123.456,“-” 匹配负号,“\d+” 匹配小数点前的数字,“\.{0,1}” 匹配一个或零个小数点,“\d*” 匹配小数点后的数字。

formula_list = [i for i in re.split('(-\d+\.{0,1}\d*)', formula) if i]

# 我猜等价于
formula_list = []
formula_list += re.split('(-\d+\.{0,1}\d*)', formula)

步骤三:判断分割出来的形为 “-数字” 的内容到底是不是负数,以及将除负数以外的数字与其相连的运算符分割开来。

# 用于存放数字和运算符
final_formula = []

循环判断分割出来的每一小段式子:

情况一:对于第一段式子,如果它是以 “-” 开头的数字,那么必定为负数,因此不做处理,直接放入 final_formula 中,然后进入下一个循环。Q:必须要写 ^ 和 $ 吗?

for item in formula_list:
        if len(final_formula) == 0 and re.search('^-\d+\.{0,1}\d*$', item):
            final_formula.append(item)
            continue

情况二:对于非第一段式子,如果 final_formal 中的最后一个元素是运算符 ['+', '-', '*', '/', '('],则 “-数字” 是负数。换句话说,如果形为 “X-数字” 中的 “X” 是数字,那么 “-数字” 就一定不是负数。final_formula[-1] 代表列表中的最后一个元素,即对于式子 “-数字”,它就是 “X-数字” 中的 “X”。

if len(final_formula) > 0:
    if re.search('[\+\-\*\/\(]$', final_formula[-1]):
        final_formula.append(item)
        continue

# 我感觉只要横杠前面不是数字就行
# re.search('[^\d]$', final_formula[-1])

情况三:对于不满足前面两种情况的式子,它就是一个不具有 “包含负数” 可能性的普通式子,只要把里面的数字和运算符全部分割开即可。

# 按照运算符分割开
item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i]
# 全部添加到final_formula中
final_formula += item_split

步骤四:返回 final_formula 列表。


整段代码

import re

def formula_format(formula):
    formula = re.sub(' ', '', formula)
    formula_list = [i for i in re.split('(-\d+\.{0,1}\d*)', formula) if i]

    final_formula = []
    for item in formula_list:
        if len(final_formula) == 0 and re.search('^-\d+\.{0,1}\d*$', item):
            final_formula.append(item)
            continue
 
        if len(final_formula) > 0:
            if re.search('[\+\-\*\/\(]$', final_formula[-1]):
                final_formula.append(item)
                continue

        item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i]
        final_formula += item_split
    return final_formula

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/131744909