使用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
相关产品推荐
相关产品推荐

