【发布时间】: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+'吗?