我有以下字符串:
"{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}"
我想将其转换为表达式。直接申请ToExpression
仅提供最后一个,即{f[{x, 1 + y}]}
。如何获得整个列表?
答案 0 :(得分:8)
您可以查看ToExpression
的文档以查找其第三个参数,并使用
ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold]
以防止评估。
转换表达式或提取部分(Extract
,Level
等)的几个函数可以选择将提取的部分包装在任意函数中。常见的用法是将它们包装在Hold
中,以防止评估。
编辑:请注意,您的表达式不是列表。这是一个CompoundExpression
。您可能正在寻找
ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold] /. CompoundExpression -> List // ReleaseHold
你能解释一下你想要实现的目标以及从哪里获得字符串吗?
答案 1 :(得分:1)
实际上ToExpression
正在将整个字符串转换为您期望的表达式。在以下示例中
In[1]:= ToExpression["a=1;b=2"]
Out[1]= 2
In[2]:= a
Out[2]= 1
您可以看到第一部分a=1
被正确评估为CompoundExpression
的一部分。
您可能想要的是将由分号分隔的表达式转换为表达式列表。你可以使用StringSplit:
In[3]:= ToExpressionList[s_String] := ToExpression /@ StringSplit[s, ";"]
In[4]:= ToExpressionList["x;y"]
Out[4]= {x,y}
修改:
看起来您正在尝试使用分号作为列表
在Mathematica中,你必须使用,
。所以你
也可以用,
代替;
来实现你想要的
您的字符串,然后再应用ToExpression
:
In[20] := ToExpression @
StringReplace[
"{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}",
";" -> ","
]
Out[20] = {f({x-1,y}),f({x+1,y}),f({x,y+1})}