【问题标题】:Evaluate mathematical expression inside string [closed]评估字符串内的数学表达式[关闭]
【发布时间】:2022-01-17 09:42:25
【问题描述】:

我的问题很简单,假设我有一个像s = 'line $sin(2*x) $x*cos(x) $x' 这样的字符串,并且我从其他地方知道x 的值(例如1.0)。现在我想评估这个字符串,让它变成s = line 0.909 -0.416 1.0'。您可以看到字符串 s 中有三个数学表达式:每个都以 $ 符号开头,以空格或行尾结尾。

想法应该很简单:使用正则表达式和re.sub 函数。我以前对正则表达式一无所知,一两个小时后我知道了它的基本知识,但仍然无法弄清楚如何获得一个合适的模式来匹配这三个表达式,每个表达式都是独立的。如果我成功了,剩下的部分很简单,使用 eval() 评估表达式,转换为字符串,然后组装要返回的整个字符串。我想出的代码如下。

import re
from math import *

# parameters
x = 1.0
# test strings
s = 'line $sin(2*x) $x*cos(x) $x'

p = '\$[\s+]'

def replacer(s):
    if s.startswith('$'):
        return eval(s[1:])
    else:
        return "ERROR"

print re.sub(p,replacer,s)

我确定正则表达式是错误的,因为它没有捕获这三种模式,我用不同的模式尝试了很多次......有人可以帮我找到一个工作模式吗?然后我想我可以继续剩下的。 更新:问题已解决,请参阅下面的选定答案。

【问题讨论】:

  • \s 是空格的元字符...
  • 好的。而你的问题是?你什么都没问!
  • @alKid 问题是代码不行,我写的正则表达式肯定是错的。例如,我想匹配三个表达式中的每一个:$sin(2*x) 和 $x*cos(x) 和 $x,并用我拥有的 x 值 (1.0) 评估它们。我已经尽可能多地获得上面的代码,但我无法继续,这就是我在这里寻求帮助的原因。
  • @Dannnno 网上有人说都是非空白字符,我去查一下...
  • 你想要r'\$\S+'吗?

标签: python regex


【解决方案1】:

你的第一个问题是你在你的正则表达式中使用了[\s+],它只会匹配一次空格或+号。
您想要的正确表达式是\$(\S+),它将除 $ 符号之外的所有内容放入捕获组以供以后使用。

其次,您需要以 Python 的方式开始编写 Python。将随机变量与您的值和表达式行放在一起是不可重用的。
相反,将重复变量封装在函数范围内。从长远来看,它会减少头痛。

在此实例中您需要的正则表达式函数不是re.sub,而是re.findall。此函数遍历字符串中的所有匹配项。

你会注意到我在使用它之前编译了正则表达式,这只是允许在这种情况下使用更清晰的代码。

最后,我们遍历一个非常简单的list() 正则表达式匹配数据类型。

如您所见,您可以简单地对任意表达式和任意值调用 evaluate_expression() 函数。

import re
from math import *


def evaluate_expression(equation, **kwargs):
    for key in kwargs:
        exec key + " = " + str(kwargs[key])  # Creates x variable
    parser = re.compile(r'\$(\S+)')
    expressions = parser.findall(equation)
    for expression in expressions:
        print eval(expression)

evaluate_expression('line $sin(2*x) $x*cos(x) $x', x=1.0)

【讨论】:

  • 您的回答非常有帮助,非常感谢,我可以从中学到很多东西——不仅仅是针对这个特定问题。我希望我可以对您的回答投赞成票,但目前我没有足够的声誉(尤其是对我的问题的投反对票:-( ),所以我稍后会这样做。谢谢!
  • 没问题。我什至通过回答这个问题学到了一些新东西。 20分钟前我还不知道怎么用**kwargs
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
相关资源
最近更新 更多