Python正则表达式可以用来匹配字符串中的某种格式,对于计算器而言,就可以利用正则表达式实现输入的字符串转化为计算结果的功能。
步骤如下:
- 将输入的字符串中的空格去除掉
代码块:
input_str = input_str.replace(' ', '')
这一步很重要,可以去除多余的空格,避免对后续的计算造成影响。
- 利用正则表达式匹配数字和运算符
我们可以定义正则表达式来匹配数字和运算符,例如用“\d”表示数字,“+”、“-”、“*”、“/”表示四则运算符号。
代码块:
import re
matches = re.findall(r'\d+|[-+*\/]', input_str)
使用Python的re模块,利用findall函数匹配字符串中满足正则表达式的部分。这个正则表达式中,“|”表示或的意思,匹配数字和运算符。
- 计算表达式
紧接着我们就可以对得到的数字和运算符进行简单计算,而这里主要需要注意一下运算符的优先级问题。比如说,“*”、“/”的优先级要高于“+”、“-”。
代码块:
result = 0
num_stack = [] # 数字栈
opr_stack = [] # 运算符栈
for match in matches:
if match.isdigit(): # 如果是数字,直接进栈
num_stack.append(int(match))
else: # 如果是运算符,先判断栈顶元素是否需要出栈,然后入栈当前运算符
if not opr_stack: # 运算符栈为空,直接入栈
opr_stack.append(match)
elif match in ['*', '/']: # 如果当前运算符为乘法或除法
top = opr_stack[-1]
if top in ['+', '-']: # 栈顶是加减,直接入栈
opr_stack.append(match)
else: # 栈顶是乘除,出栈计算
opr = opr_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
if opr == '*':
num_stack.append(num1 * num2)
else:
num_stack.append(num1 / num2)
opr_stack.append(match)
else: # 如果当前是加减符号
opr = opr_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
if opr == '+':
num_stack.append(num1 + num2)
else:
num_stack.append(num1 - num2)
opr_stack.append(match)
# 把栈内剩下的元素全部出栈计算
while opr_stack:
opr = opr_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
if opr == '+':
num_stack.append(num1 + num2)
else:
num_stack.append(num1 - num2)
# 结果就是栈底元素
result = num_stack.pop()
至此,我们就可以得到输入字符串的计算结果。
下面是两个计算的示例:
输入字符串为“1 + 2 * 3 - 10 / 5”,计算结果为“7”。
输入字符串为“5 * ( 3 + 7 )”,计算结果为“50”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python正则实现计算器功能 - Python技术站