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
和SymPy的str.replace
) 如果符号名称中的字符也用于表示符号名称之外的数学(如使用expr.replace
表示实际的求幂),则此操作将不起作用^
- 一般来说,您可能需要编写自己的解析工具。
可以在这里提供帮助symphy中的symphy解析实用程序。解析
Symphy
的任何字符串都必须是合法的Symphy表达式,即str1
不是。@BillBell对SymPy符号名称的唯一要求是字符串。它可以有空格、换行符、空等。请尝试a=symbol('\n\n');展开((a+1)**3)
。@如果……:我应该写“您可以定义像**4(etc)这样的符号”…我真的试过这个。把它塞进solve
中的一个表达式中,sympy就会咳嗽。另一个答案更好,你可能需要移动复选标记