使用 re.compile 计算微分多项式的系数并在 python 中搜索

Calculating the coefficients of a differentiated polynomial using re.compile and searching in python

测试多项式 '2x^3+4x^2+8x-16' 我下面的代码输出 [6, 8]作为微分多项式的系数。但是,输出应该是 [6, 8, 8]为什么函数 getNewCoefficients 产生了错误的结果?产生正确结果的好方法是什么?

def getNumbers(polynomial):
    regex = re.compile(r"[+-]?\d+(?:\.\d+)?")
    return  regex.findall(polynomial)

def formatNumbers(numbers):
    formattedNumbers = []
    for e in numbers:
        if (e[0] == '+'):
            formattedNumbers.append(e[1:])
        else:
            formattedNumbers.append(e)
    return formattedNumbers

def getNumberPositions(polynomial, numbers):
    numberPositions =  []
    for e in numbers:
        tmp = [m.start() for m in re.finditer(e, polynomial)]  
        for f in tmp:
           if f not in numberPositions:
                numberPositions.append(f)
    return sorted(numberPositions)

def getNewCoefficients(polynomial, numberPositions, numbers):
    tmp = '0'
    newCoefficients = []
    for i in range(0,len(numberPositions)):
        if numberPositions[i] + 1 < len(polynomial):
            if polynomial[numberPositions[i] + 1] == '+' or polynomial[numberPositions[i] + 1] == '-':
                newCoefficients.append(int(numbers[i])*int(tmp))
        elif numberPositions[i] - 1 > 0:
            if polynomial[numberPositions[i] - 1] == '+' or polynomial[numberPositions[i] - 1] == '-':
                newCoefficients.append(int(numbers[i]))
        tmp = numbers[i]
    return newCoefficients

你不需要re模块,你可以使用sympy模块,但你必须先从http://www.sympy.org/en/index.html. I'm not a sympy expert, but I found a similar Stack Overflow question下载它,这可能对你有帮助。

而且,让你知道,指数不算作系数...

这个问题可以使用负向回顾断言更容易地解决。

COEFFICIENT_PATTERN = re.compile(r"(?<!x\^)(?<!x\^-)-?\d+")
coefficients = [int(c) for c in COEFFICIENT_PATTERN.findall(polynomial)]

此解决方案对 x^x^- 使用了两个负后视(因为后视必须是固定长度)。所以它写着“给我所有不以 x^.

开头的整数
>>> COEFFICIENT_PATTERN.findall('2x^3+4x^2+8x-16')
['2', '4', '8', '-16']