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

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"));
}

错误原因分析

  1. 循环逻辑差异:JavaScript的for (var i = 0; i < str.length; i++)会动态判断字符串长度,每次修改str后循环终止条件自动更新;但Python的for i in range(len(string))是基于初始字符串长度生成固定循环范围,当循环中修改string导致长度缩短后,后续的i会超出新字符串的长度,触发索引越界错误。
  2. 变量未定义:Python代码最后一行的cadena是未定义变量,应改为string。
  3. 字符串修改后的索引偏移: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

修正说明

  1. 改用while循环替代固定范围的for循环,实现动态判断字符串长度的逻辑,从根源避免索引越界。
  2. 修改字符串后手动将i减1,保证后续循环不会跳过字符,对齐JavaScript的循环行为。
  3. 修复未定义变量问题,替换为正确的string变量。
  4. 实现Python版本的unescape逻辑,将%u00XX格式的转义字符转换为对应ASCII字符,还原JavaScript原函数的解码功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:35:30