Python 对包含上标表达式的字符串进行联合

Python 对包含上标表达式的字符串进行联合,python,sympy,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/l

我正试着理解这样一个字符串

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
回溯(最近一次呼叫最后一次):
文件“cuaterniones_basic.py”,第114行,在
pprint(sympify(str1,locals=ns))
文件“/usr/local/lib/python2.7/dist packages/sympy/core/sympify.py”,第356行,在sympify中
引发SympifyError('无法分析%r'%a,exc)
sympy.core.sympify.SympifyError:表达式“的sympify无法分析u^0\u 0”失败,因为引发了异常:
语法错误:无效语法(,第1行)

如何才能得到我想要的符号?

事实上,在将片段转换为SymPy原子之前,解析器会决定输入字符串的结构。 有一堆旋钮可以通过使用而不是使用sympify来扭转,但我还没有找到一个适用于此字符串的旋钮。相反,使用字符串替换来预处理输入可能是最容易的,用其他东西替换麻烦的字符。此预处理不会影响最终结果,因为字典
ns
wi我会把事情恢复正常的

str1 = "a^0_0"
new_str1 = str1.replace("^", "up")
ns = {new_str1: Symbol(str1)}
print(sympify(new_str1, locals=ns))

打印一个^0_0,它是所创建符号的名称。

sympify
只能解析有效Python的表达式(有一些小的例外)。这意味着符号名称只有在它们是有效Python变量名时才能解析。解决方案取决于您试图解析的内容的确切性质

  • 如果整个字符串是符号名,只需使用
    symbol
    而不是
    sympify

  • 如果要从已知字符串构造符号对象,请将它们包装在字符串中的
    Symbol(“…”)
    ,如
    sympify(“Symbol(^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

    如果符号名称中的字符也用于表示符号名称之外的数学(如使用
    ^
    表示实际的求幂),则此操作将不起作用

  • 一般来说,您可能需要编写自己的解析工具。
    symphy中的symphy解析实用程序。解析
    可以在这里提供帮助


AFAIK,Symphy中可用的符号与Python中的标识符相同。您可以定义类似**4的符号,但至少在某些上下文中,Symphy无法解析包含此符号的多项式方程。此外,发送到
Symphy
的任何字符串都必须是合法的Symphy表达式,即
str1
不是。@BillBell对SymPy符号名称的唯一要求是字符串。它可以有空格、换行符、空等。请尝试
a=symbol('\n\n');展开((a+1)**3)
。@如果……:我应该写“您可以定义像**4(etc)这样的符号”…我真的试过这个。把它塞进
solve
中的一个表达式中,sympy就会咳嗽。另一个答案更好,你可能需要移动复选标记