包含含有上标的表达式的字符串

时间:2018-01-26 02:06:35

标签: python sympy

我试图同意这些字符串

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

如何获得我想要的符号?

2 个答案:

答案 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,这是创建的符号的名称。