如何在python中使用人类可读单元评估数学表达式?

sam*_*man -1 python evaluation expression units-of-measurement

有没有办法从包含人类可读数字单位的字符串中计算表达式?

例如:

myformula='1u+1e-6'
result = eval(myformula)
Run Code Online (Sandbox Code Playgroud)

......应该等于1e-6+1e-6(其中u = micro).

Zer*_*eus 5

这个答案在一定程度上扩展了Joran,用适当的指数代替所有的SI事务:

import re

SI = {
    "T": 12,
    "G": 9,
    "M": 6,
    "k": 3,
    "h": 2,
    "da": 1,
    "d": -1,
    "c": -2,
    "m": -3,
    "u": -6,
    "n": -9,
    "p": -12,
}

SI_REGEX = re.compile(r"(?<=\d)(%s)\b" % "|".join(SI))

def repl_si(match):
    return "e%d" % SI[match.group()]

def defix(formula):
    return re.sub(SI_REGEX, repl_si, formula)
Run Code Online (Sandbox Code Playgroud)

使用字典SI,我们创建一个正则表达式,它将匹配任何键,SI只要它们前面有一个数字,后跟一个单词边界:

(?<=\d)(T|G|M|k|h|da|d|c|m|u|n|p)\b
Run Code Online (Sandbox Code Playgroud)

接下来,我们定义一个替换函数 repl_si(),用于查找匹配SI并将其替换为与"e"指数连接.

然后,我们要做的就是编写一个函数,re.sub()使用正则表达式,替换函数和公式适当调用,并且vo:

>>> defix("1T + 2G + 3M + 4k + 5h + 6da + 7d + 8c + 9m + 1u + 2n + 3p")
'1e12 + 2e9 + 3e6 + 4e3 + 5e2 + 6e1 + 7e-1 + 8e-2 + 9e-3 + 1e-6 + 2e-9 + 3e-12'
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是调用eval()结果,当然您绝对不应该使用用户提供的输入.