从Python中的数学线性表达式中提取系数

时间:2018-07-11 10:06:26

标签: python expression

给出一个在某些变量中包含线性表达式的字符串,这些变量的名称可能是未知的,我想返回一个字典,将变量名作为键,将各个系数作为值。

示例

输入:

s = "- x0 + 2 * x1 + 4 * x2 - 3 * y + z + 8"

输出:

{'x0': -1, 'x1': 2, 'x2': 4, 'y': -3, 'z': 1}

1 个答案:

答案 0 :(得分:1)

您可以使用([+-])?\s*(?:(\d+)\s*\*\s*)?([a-z]\w*)之类的正则表达式。在这里,第一部分(系数,包括*)是可选的,但是只存储符号和实际数字以及变量。然后,您可以将其转换为字典。

>>> import re
>>> s = "- x0 + 2 * x1 + 4 * x2 - 3 * y + z + 8"
>>> p = r"([+-])?\s*(?:(\d+)\s*\*\s*)?([a-z]\w*)"
>>> re.findall(p, s)
[('-', '', 'x0'),
 ('+', '2', 'x1'),
 ('+', '4', 'x2'),
 ('-', '3', 'y'),
 ('+', '', 'z')]
>>> {v: int(s+(c or '1')) for (s, c, v) in _ }
{'x0': -1, 'x1': 2, 'x2': 4, 'y': -3, 'z': 1}

正则表达式的分解:

  • ([+-])?\s*:可选符号,后跟空格
  • (?:(\d+)\s*\*\s*)?可选系数,后跟*和空格;仅捕获实际数字
  • ([a-z]\w*):变量的名称