【问题标题】:How to split an arbitrary math expression by its multipliers如何通过乘数拆分任意数学表达式
【发布时间】:2017-08-05 04:25:11
【问题描述】:

我想用乘数分割长数学方程。 表达式以字符串形式给出,其中允许使用空格。

例如:

"((a*b>0) * (e>500)) * (abs(j)>2.0) * (n>1)"

应该返回:

['a*b>0', 'e>500', 'abs(j)>2.0', 'n>1']

如果使用除法,事情会变得更加复杂,但假设一开始没有除法。解决这个问题的最pythonic方法是什么?

【问题讨论】:

  • 每个部分都用括号隔开吗?
  • 从现在开始你做了什么?您遇到过任何特殊问题吗?
  • @WillemVanOnsem,不,但如果输入字符串为“(ab)>cd”,则输出应为 ['(ab)>c d'] 或 ['ab>cd']

标签: python string split symbolic-math


【解决方案1】:
import re

string = "((a-b>0) * (e + 10>500)) * (abs(j)>2.0) * (n>1)"
signals = {'+','*','/','-'}

###
##

def splitString(string):

    arr_equations = re.split(''([\)]+(\*|\-|\+|\/)+[\(])'',string.replace(" ", ""))

    new_array = []

    for each_equa in arr_equations:

        each_equa = each_equa.strip("()")

        if (not(each_equa in signals)):
            new_array.append(each_equa)

    return new_array

###
##    

print(splitString(string))

【讨论】:

  • ((a*b>c)-(a*b>c)) 这个例子会产生 ['ab>c', 'ab>c']
  • @greyxray 当我运行我的程序时,该示例运行良好,请再次检查。输出:['a*b>c', 'a*b>c']
  • 但这不是乘数分割,是减法运算
【解决方案2】:

您可以简单地使用split() 函数:

ans_list = your_string.split(" * ")

注意乘数符号周围的空格。这假设您的字符串与您所说的完全一样。

【讨论】:

  • 这也会拆分内部乘数:['((a', 'b>0) ', ' (e>500)) ', ' (abs(j)>2.0) ', ' (n>1)']
  • 已修复,至少对于 OP 给出的示例
  • @pCube 您假设内部乘数周围没有空格...
  • @pCube:说实话,我认为这并不能真正解决问题。根据问题,用户可能可以输入任意表达式。所以他/她可以输入(a * b)*c。这将分裂内部而不分裂外部。
  • 同意过多的假设部分。但这适用于 OP 的示例。如果需要,我可以尝试提出更通用的解决方案。
【解决方案3】:

你可以使用正则表达式:

s = "((a*b>0) * (e>500)) * (abs(j)>2.0) * (n>1)"
s = ''.join(s.split())
s = re.split(r'([\)]+[\*\+\-/\^]+[\(])', s)
res = []
for x in s:
    x = re.sub(r'(^[\(\)\*\+\-\/]+)', '', x)
    x = re.sub(r'([\(\)]+$)', '', x)
    if len(x) > 0: res.append(x)
print(res)

【讨论】:

  • 如果您解释正则表达式的工作原理,正则表达式的答案会更有帮助。
  • 首先,我将 s 拆分为 '[)]+*[(]+',然后我在字符串的开头删除了一些 '(' 或字符串结尾的 ')'
  • @nguyenthanhchinh, contrexample "((a*b>c) - (a*b>c))" 将产生['a*b>c)-(a*b>c']
  • @greyxrar,我刚刚修复了答案,希望对您有所帮助
  • @nguyenthanhchinh 您应该编辑您的答案以包含解释,而不是将其留在 cmets 中。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2023-02-20
  • 2020-09-02
相关资源
最近更新 更多