我试图同意这些字符串
str1="a^0_0"
ns={}
ns['a^0_0']=Symbol('a^0_0')
pprint(sympify(str1,locals=ns))
但是我收到以下错误
Traceback (most recent call last):
File "cuaterniones_basic.py", line 114, in <module>
pprint(sympify(str1,locals=ns))
File "/usr/local/lib/python2.7/dist-packages/sympy/core/sympify.py", line 356, in sympify
raise SympifyError('could not parse %r' % a, exc)
sympy.core.sympify.SympifyError: Sympify of expression 'could not parse u'a^0_0'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1
如何获得我想要的符号?
答案 0 :(得分:2)
sympify
只能解析表达式,如果它们是有效的Python(除了一些小的例外)。这意味着只有符号名称是有效的Python变量名称才能解析它们。解决方案取决于您要解析的内容的确切性质。
如果整个字符串是符号名称,只需使用Symbol
代替sympify
。
如果您正在使用已知字符串构建Symbol对象,请将其包裹在字符串Symbol('...')
中,例如sympify("Symbol('a^0') + 1")
。
如果您知道将要看到的字符,可以在解析之前尝试交换它们,然后使用replace
将它们交换回表达式。
>>> sympify('a^0 + 1'.replace('^', '__').replace(lambda a: isinstance(a, Symbol), lambda a: Symbol(a.name.replace('__', '^')))
a^0 + 1
(不要在此处混淆str.replace
和SymPy的expr.replace
)。
如果符号名称中的字符也用于表示符号名称之外的数学(如果使用^
表示实际取幂),则无效。
通常,您可能需要编写自己的解析工具。 SymPy在sympy.parsing
中的解析实用程序可以在这里提供帮助。
答案 1 :(得分:0)
实际上,在将片段转换为SymPy原子之前,解析器会对输入字符串的结构做出决定。
有一堆旋钮可以使用parse_expr而不是同情来扭曲,但我还没有找到适用于此字符串的旋钮。相反,用字符串替换来预处理输入可能是最容易的,用其他东西替换麻烦的字符。这种预处理不会影响最终结果,因为字典ns
会使事情再次正确。
str1 = "a^0_0"
new_str1 = str1.replace("^", "up")
ns = {new_str1: Symbol(str1)}
print(sympify(new_str1, locals=ns))
打印a^0_0
,这是创建的符号的名称。