作者:201153蜡笔小新 | 来源:互联网 | 2023-05-23 09:16
有没有办法从包含人类可读数字单位的字符串中计算表达式?
例如:
myformula='1u+1e-6'
result = eval(myformula)
......应该等于1e-6+1e-6
(其中u = micro).
1> Zero Piraeus..:
这个答案在一定程度上扩展了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)
使用字典SI
,我们创建一个正则表达式,它将匹配任何键,SI
只要它们前面有一个数字,后跟一个单词边界:
(?<=\d)(T|G|M|k|h|da|d|c|m|u|n|p)\b
接下来,我们定义一个替换函数 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'
现在您需要做的就是调用eval()
结果,当然您绝对不应该使用用户提供的输入.