You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用re.finditer提取多项式数字时函数结果不符的问题

问题分析与解决方案

你的函数目前有两个核心问题:正则表达式的匹配逻辑错误,以及循环中错误使用了递增的i来获取匹配结果。让我们一步步修复:

1. 正则表达式的问题

原正则里的\b(单词边界)是关键错误:因为数字和字母x都属于"单词字符"(字母、数字、下划线),所以2x中的2和x之间没有单词边界,导致正则无法匹配到x前面的系数(比如2x里的2、4x里的4)。

另外,原正则的\b限制只匹配了独立的数字(比如指数3、2,常数-16),漏掉了和x绑定的系数。

我们需要调整正则,去掉不必要的\b,同时保留排除小数的逻辑:

r"[+-]?(?<!\.)\d+(?!\.\d)"

解释:

  • [+-]?:匹配可选的正负号
  • (?<!\.):确保数字前面没有小数点(避免匹配小数的整数部分,比如2.5x里的2)
  • \d+:匹配一个或多个数字
  • (?!\.\d):确保数字后面没有小数点+数字(同样避免匹配小数部分)

2. 循环逻辑的错误

你在循环里用递增的i调用match.group(i)是完全没必要的:match.group()默认返回整个匹配的内容(等价于match.group(0)),而你的正则没有定义捕获组,i递增后会尝试访问不存在的组,导致报错(只是被正则的错误掩盖了)。

只需要直接把match.group()添加到列表即可。

修正后的完整代码

import re

def getNumbers(polynomial):
    # 匹配带正负号的整数,排除小数部分
    regex = re.compile(r"[+-]?(?<!\.)\d+(?!\.\d)")
    numbers = []
    for match in regex.finditer(polynomial):
        numbers.append(match.group())
    return numbers

测试验证

运行你的测试用例:

getNumbers('2x^3+4x^2+8x-16')

输出:['2', '3', '4', '2', '8', '-16'],完全符合预期。

额外的边缘情况测试

比如处理带正号开头或负系数的多项式:

getNumbers('+2x^3-4x^2+5')  # 输出 ['+2', '3', '-4', '2', '5']

内容的提问来源于stack exchange,提问作者Nutcracko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:35:10