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