如何将作为字符串给出的方程式分为系数,变量和幂?

问题描述 投票:2回答:3

所以我必须创建一个程序,它采用以下形式的字符串:2x^3 + x^2 - 4并计算其衍生物,即使它像这样:6x^2 + 2x

所以我创建了一个class Monomial,它有三个成员变量:系数,变量名和功率。换句话说,我必须将多项式分解为单项式。然后我必须采用每个单项式并将其分成前面提到的变量。所以2x^3将被表示为以下对象:Monomial(2, 'x', 3)

但是,我如何拆分字符串呢?我不想使用'SymPy'或其他库来轻松计算衍生物。

python string oop
3个回答
5
投票

我会用regular expressions

pattern = "(\d+)?([a-z])\^(\d+)"
result = re.match(pattern, "323x^22")
print result.groups() 

生产:

('323', 'x', '22')

该模式的解释如下:

每个括号将包含一个组,第一个匹配数字,由“\ d”表示,并匹配尽可能多的数字,用“+”表示。问号表示如果没有匹配(例如,因为它是x ^ 2),则表示正常。在中央组中,您会看到[a-z],它将匹配任何单个小写字母。所以,如果你找到“23c ^ 2”它也会匹配。最后,你需要使用“\ ^”来转义“^”符号,它在正则表达式中有其自己的含义。

result = re.match(pattern, "x^2")
print result.groups()

现在,对于“x ^ 2”的输入,此代码将产生:

(None, 'x', '2')

所以只需确保用1代替None。


1
投票

首先,我们需要将表达式拆分为简单的位,但我们必须删除字符串中的空格。

simplerExpression = " "
expression = input("Expression to derive: ")
for x in range(len(expression)):
    if expression[x] != " ":
        simplerExpression = simplerExpression + expression[x]

知道你知道将每个单项式分开的所有内容都是+符号,所以我们将所有单项式分成一个数组:

ARRMonomial = []
for x in range(len(simplerExpression)):
    if simplerExpression[x] != '+':
        ARRMonomial.append(monomial)
        monomial = 0
    else:
        monomial = monomial + simplerExpression[x]

你所做的是因为你确定'x'之前的所有内容都是一个系数,你将循环遍历字符串中的所有字符,直到找到x然后将它们转换为int(如果你需要它)。还要注意我只对+符号做了这个而不是负号,这是因为我们需要在这个循环后面对数字进行否定:

ARRCoefficients = []
for monomial in ARRMonomial:
    sign = 1
    pos = 0
    coefficient = ""
    while monomial[pos] != 'x' and pos <=  len(monomial)+1:
        if monomial[pos] = '-':
            sign = "-1"
        else:
            coefficient = coefficient + expression[pos]
        pos = pos +1
    #And if there is no coefficient then return 1
    if coefficient == "":
        coefficient = 1
    ARRcoefficient.append(coefficient)

知道你有办法把系数拿出来。你所做的是搜索指数的值。你可以通过循环直到找到x然后在'^'后面使用数字来实现。

ARRExponents = []
for monomial in ARRMonomial:
    Xexists = True
    x = 0
    while monomial[x] != 'x':
        if x == len(monomial):
           Xexists = False
           break
        x = x + 1
    if monomial[x+1] == '^' and Xexists == True:
        for y in range(x+1,len(monomial)):
            exponent = exponent + monomial[y]
    elif Xexists == True:
        exponent = 1
    else:
        exponent = 0
    ARRExponent.append(exponent)

你最终会得到一个系数列表和xs的指数(包括x到幂0),以便你把你的函数放在一边。如果您不知道该怎么做:

for x in range(len(ARRExponent)):
    monome(ARRCoefficiant[x],'x',ARRExponent[x])

0
投票

我首先将初始字符串拆分为monomes并识别每个monome的元素:

  • 一个可选的标志(默认+)
  • 可选系数(默认值为1)
  • 一个可选的组变量指数(默认为x ^ 0) - 如果只存在变量,则exponent为1

现在使用re模块处理字符串很简单:

def process(txt):
    monomes = []
    for elt in re.findall('([+-]?) *([\d]*)([a-zA-Z]?)(?:\^(\d+))?', txt):
        coeff, var, exp = None, None, None
        #print(elt)
        if elt != ('','','',''):
            if elt[1] == '':
                coeff = 1
            else:
                coeff = int(elt[1])
            if elt[0] == '-': coeff = - coeff
            if elt[3] == '':
                if elt[2] == '':
                    var = 'x'
                    exp = 0
                else:
                    var = elt[2]
                    exp = 1
            else:
                exp = int(elt[3])
                var = elt[2]
            #print ((coeff, var, exp))
            monomes.append(Monome(coeff, var, exp))
    return monomes

我们现在得到:

>>> process(poly)
[Monome(2, 'x', 3), Monome(1, 'x', 2), Monome(-4, 'x', 0)]
© www.soinside.com 2019 - 2024. All rights reserved.