擅长:python、mysql、java
<p><code>eval(str1)</code>返回<code>1.*pi1.*pi</code>,因为<code>eval(str1)</code>的计算结果是<code>2*"1*pi"</code>,字符串和整数之间的乘法会导致字符串的重复。你知道吗</p>
<p>将字符串直接格式化为<code>str1</code>。你知道吗</p>
<pre><code>from math import pi
PI = "1*pi"
str1 = f"2*({PI})" # or for versions < Python-3.6: "2*({})".format(PI)
print(str1) # '2*(1*pi)'
print(eval(str1)) # 6.283185307179586
</code></pre>
<hr/>
<p>如果您无法控制<code>PI</code>,可以先计算<code>PI</code>,然后将其格式化为表达式。你知道吗</p>
<pre><code>eval(f"2*({eval(PI)})") # or equivalently eval("2*({})".format(eval(PI)))
</code></pre>
<p>如果您也不能控制<code>str1</code>,那么可以用它的文本字符串值替换所有<code>PI</code>标记:<code>1*pi</code>。你知道吗</p>
<pre><code>eval(str1.replace('PI', PI))
</code></pre>
<p>但是这不处理边缘情况,比如<code>2*PIE</code>(如果它们出现的话)。一个更健壮的解决方案是使用regex并用<code>PI</code>字符环绕<code>\b</code>以匹配完整的令牌。你知道吗</p>
<pre><code>import re
eval(re.sub(r'\bPI\b', PI, str1))
</code></pre>
<p>这适当地排除了诸如<code>2*PIZZA</code>或<code>2*API</code>之类的字符串。你知道吗</p>