一、问题的提出
之前,我写过一篇如何在word中计算数学算式:
如何用Python批量计算Word中的算式-CSDN博客
为了计算算式,就需要对算式进行格式化,把不规则的算式转换成规则的算式,这时就会涉及到一些字符的批量替换。如我们把算式:
1.3×14×2×[1+(76-50)/120]
转换成下面的规则算式,这样才能让Python中的eval()函数进行计算。
1.3*14*2*(1+(76-50)/120)
那么,如何把这里面的乘号替换成星号,把方括号替换中圆括号呢?这里我们采用下面的3种方法,通过python来实现。
二、批量字符替换的方法
1. replace法
利用replace函数,对于字符串中的三个字符进行多次替换,不需要导入其它的包,可以一次替换完成,并通过eval和round打印出保留2位小数后的结果,代码如下:
#replace法
s = "1.3×14×2×[1+(76-50)/120]"
if "×" or "[" in s:
s = s.replace("×","*").replace("[","(").replace("]",")")
print(round(eval(s),2))
2. 字典法
我们可以制作一个替换用的字典,通过Python循环字典,对于符合要求的字符进行检测,如果在字典里可以查询到,就进行替换。
# 字典法
dic = {"x":"*","[":"(","]":")"}
for k,v in dic.items():
s.replace(k,v)
print(round(eval(s),2))
以上是遍历的字典,只需要循环3次即可,下面我还可以通过利用字典+列表推导式的形式实现。这里主要采用了字典的get()方法,替换转换为列表后的字符,然后再用join()函数合成。
s = "1.3×14×2×[1+(76-50)/120]"
dic = {"x":"*","[":"(","]":")"}
s = [dic.get(i,i) for i in s] #也可以使用这个列表推导式实现。
s = "".join(s)
print(round(eval(s),2))
3. maketrans法
用maketrans生成映射表,然后用translate进行批量替换,代码如下:
#maketrans映射法
s = "1.3×14×2×[1+(76-50)/120]"
intab = "×[]"
outtab = "*()"
transtab = str.maketrans(intab,outtab)
s = s.translate(transtab)
print(round(eval(s),2))
4. 效果展示
以下是在thonny中运行的效果展示:
三、学后反思
- 三种方法都可以高效地实现替换,第一种最常见,第二种思路最清晰,第三种使用起来更简单一些。
- 考虑到制作字典比较麻烦,可以采用第三种方法,或者用zip()把两个字符列表组合成字典,再采用第二种方法进行替换。
- 第一种方法不太适用于3个以上字符的替换,那样代码量多,而且写起来比较复杂,建议采用第二种和第三种方法来解决。