【问题标题】:Convert sympy Symbol to string such that it can always be parsed?将 sympy Symbol 转换为字符串以便始终可以解析它?
【发布时间】:2019-12-19 00:17:23
【问题描述】:

我正在寻找一种将任意 sympy 符号转换为字符串的方法,以便以后可以将其解析回相同的符号。例如,我希望能够做这样的事情:

from sympy.parsing.sympy_parser import parse_expr
from sympy import Symbol

A = Symbol("A")
B = Symbol("B")
pathological = Symbol("A B")
parsed = parse_expr(str(pathological)) # this raises an error
assert parsed == pathological

解析器不是将str(pathological)解析为代表pathological符号,而是分别解析AB,我们得到以下错误:

File "<string>", line 1
Symbol ('A' )Symbol ('B' )
                  ^
SyntaxError: invalid syntax

有没有办法从pathological 创建一个转义字符串,保证解析回pathological

我尝试这样做的原因是我可以将 sympy 表达式存储为 JSON 并重建它们。如果有完全不同的方法可以做到这一点,我会很高兴听到。

【问题讨论】:

    标签: python json parsing sympy


    【解决方案1】:

    对于此类符号,我将存储 srepr() 表单。为整个表达式存储它可能太多了,因此制作一个执行 StrPrinter 所做的自定义打印机可能会很有用,除非在必要时回退到 ReprPrinter。见https://docs.sympy.org/latest/modules/printing.html

    【讨论】:

      【解决方案2】:

      如果您在将病理符号转换为字符串之前可以访问它们,那么您可以创建一个“紧缩”版本,该版本将正常解析并在local_dict 中传递带有所需版本的紧缩版本。 re.escape 将在空格前放置一个反斜杠,紧缩版本将用独特的东西替换 \

      >>> kerned = re.escape(str(pathological)).replace('\\ ','_kern_')
      >>> d = {kerned: pathological}
      >>> parse_expr(kerned, d)
      A B
      

      【讨论】:

      • 感谢您的回复。您的解决方案修复了符号包含空格的特定情况,但还有其他情况仍然存在问题,例如符号以数字开头、包含连字符或某些其他符号。我什至不知道所有案例是什么,所以我希望有一个涵盖所有案例的同情方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2021-01-06
      相关资源
      最近更新 更多