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

时间:2015-12-14 15:09:02

标签: python string oop

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

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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,然后在&#39; ^&#39;之后使用数字。

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])

答案 2 :(得分:0)

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

  • 可选符号(默认+)
  • 可选系数(默认为1)
  • 一个可选的组变量指数(默认为x ^ 0) - 如果只存在变量,则指数为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)]