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

Python用re.match与pop()识别重复字符时触发索引越界错误

问题描述

编写程序实现连续重复字母单词识别功能:例如输入"JJJOOOHHHNNN"时,预期输出去重连续重复字符后的识别结果"JOHN"。程序运行时抛出list index out of range索引越界错误,要求定位错误根源并给出修复方案,且必须使用re.match()和pop()函数完成功能开发,不采用其他更简便的实现方式。

原问题代码
import re 
letters="ABCDEFGHIJKLMNOPRSTQUWXYZ"
def recognize_name(name):
    name=name.upper()
    result=[]
    temp=len(name)
    while len(name)!=0:
        for j in letters:
            if re.match("^{0}+".format(j), name):
                name=list(name)
                while name[0] == j:
                    name.pop(0)
                name="".join(name)
            else:
                continue
        result+=j
    result="".join(result)
    return result
print(recognize_name("JJJOOOHHHNNN"))
报错信息
Exception has occurred: IndexError
list index out of range
File "C:\Users\macie\OneDrive\Desktop\Folder\My_repo\plik2.py", line 11, in recognize_name
while name[0] == j:
File "C:\Users\macie\OneDrive\Desktop\Folder\My_repo\plik2.py", line 19, in <module>
print(recognize_name("JJJOOOHHHNNN"))
错误根源
  • 内层弹出字符的while循环未做空列表校验:当连续执行pop(0)将当前匹配的所有重复字符弹出后,name可能已变为空列表,此时直接访问name[0]会直接触发索引越界。
  • 结果拼接逻辑位置错误:result+=j写在for循环外部,每次遍历完整个字母表才会将最后一个遍历到的字符(固定为字母Z)加入结果,既无法正确收集匹配到的字符,也会导致结果完全不符合预期。
  • 匹配完成后缺少循环跳出逻辑:每次匹配到对应字符、完成弹出操作后,没有立刻终止当前for循环,会继续遍历剩余所有字母,当name已经为空时仍会执行后续判断逻辑,进一步触发越界问题。
修复方案与可运行代码

针对以上问题做三点修改:

  1. 在内层while循环的判断条件中增加len(name) > 0校验,空列表时直接终止弹出循环
  2. 将字符加入结果列表的逻辑移动到匹配成功的分支内,匹配到有效字符、弹出完所有重复项后立刻将当前字符加入结果
  3. 完成单字符匹配与弹出操作后,立刻通过break跳出当前for循环,回到外层while的非空判断,重新从字母表起始位置匹配下一段重复字符

修复后完整代码如下:

import re 
letters="ABCDEFGHIJKLMNOPRSTQUWXYZ"
def recognize_name(name):
    name = name.upper()
    result = []
    while len(name) != 0:
        for j in letters:
            if re.match("^{0}+".format(j), name):
                name = list(name)
                # 增加非空判断,避免空列表访问0号索引
                while len(name) > 0 and name[0] == j:
                    name.pop(0)
                name = "".join(name)
                # 匹配到的字符加入结果集
                result.append(j)
                # 跳出当前字母遍历,重新从首字母开始匹配下一段字符
                break
    return "".join(result)

print(recognize_name("JJJOOOHHHNNN"))

运行上述代码,将正确输出JOHN,无索引越界报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:09:25