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已经为空时仍会执行后续判断逻辑,进一步触发越界问题。
修复方案与可运行代码
针对以上问题做三点修改:
- 在内层
while循环的判断条件中增加len(name) > 0校验,空列表时直接终止弹出循环 - 将字符加入结果列表的逻辑移动到匹配成功的分支内,匹配到有效字符、弹出完所有重复项后立刻将当前字符加入结果
- 完成单字符匹配与弹出操作后,立刻通过
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
相关产品推荐
相关产品推荐

