Python版userID_decoding函数报IndexError: string index out of range求助
问题排查:Python版userID_decoding函数索引越界错误
问题描述
我将可正常运行的JavaScript版userID_decoding解码函数转换为Python版本,用于通过解码数字还原分析用邮箱,但转换后的Python代码持续抛出IndexError: string index out of range错误,多次修改仍未解决,请求帮忙排查。
相关代码
Python代码(有问题版本)
def userID_decoding(string): arr = [] string = "," + string # print(string) for i in range(len(string)): if len(string) == 0: print("Error: Empty string passed") return arr.append(string[i]) print(arr) if arr[i] == "," and i > 0: string = string[:i-1] + string[i:] print(string) string = string[:len(string)-1] print(string) print(cadena.replace(",", "").replace("\"", ""))
JavaScript代码(正常运行版本)
function userID_decoding(str) { var arr = []; str = "," + str; console.log(str) for (var i = 0; i < str.length; i++) { arr[i] = str.charAt(i); if (arr[i] == "," && i > 0) { str = str.slice(0, i - 1) + str.slice(i); console.log(str); } } str = str.slice(0, str.length - 1); console.log(str); return unescape(str.replace(/((,)|("))/g, "%u00")); }
错误原因分析
- 循环逻辑差异:JavaScript的
for (var i = 0; i < str.length; i++)会动态判断字符串长度,每次修改str后循环终止条件自动更新;但Python的for i in range(len(string))是基于初始字符串长度生成固定循环范围,当循环中修改string导致长度缩短后,后续的i会超出新字符串的长度,触发索引越界错误。 - 变量未定义:Python代码最后一行的
cadena是未定义变量,应改为string。 - 字符串修改后的索引偏移:JavaScript中修改字符串后,下一次循环的
i会自动适配新长度;但Python固定范围的循环不会调整,且修改字符串后未手动修正i的位置,导致后续字符访问错位。
修正后的Python代码
def userID_decoding(string): arr = [] string = "," + string i = 0 while i < len(string): if len(string) == 0: print("Error: Empty string passed") return char = string[i] arr.append(char) print(arr) if char == "," and i > 0: # 截断字符串,对应JS的slice操作 string = string[:i-1] + string[i:] print(string) # 字符串缩短后回退索引,避免跳过字符 i -= 1 i += 1 # 去掉最后一个字符,对应JS的slice(0, str.length-1) if len(string) > 0: string = string[:-1] print(string) # 替换字符并模拟JS的unescape逻辑 processed_str = string.replace(",", "").replace("\"", "") # 处理%u00XX格式的转义字符 import re def hex_to_char(match): return chr(int(match.group(1), 16)) result = re.sub(r"%u00([0-9a-fA-F]{2})", hex_to_char, processed_str) print(result) return result
修正说明
- 改用
while循环替代固定范围的for循环,实现动态判断字符串长度的逻辑,从根源避免索引越界。 - 修改字符串后手动将
i减1,保证后续循环不会跳过字符,对齐JavaScript的循环行为。 - 修复未定义变量问题,替换为正确的
string变量。 - 实现Python版本的
unescape逻辑,将%u00XX格式的转义字符转换为对应ASCII字符,还原JavaScript原函数的解码功能。
内容的提问来源于stack exchange,提问作者Jonathan Reyes
相关产品推荐
相关产品推荐

