热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在python中使用人类可读单元评估数学表达式?》经验,为你挑选了1个好方法。

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

例如:

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()结果,当然您绝对不应该使用用户提供的输入.


推荐阅读
author-avatar
201153蜡笔小新
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有