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

Python中含数字的驼峰字符串转蛇形字符串问题求助

驼峰式字符串转蛇形(含连续数字)的修复方案

问题分析

你提供的代码在处理连续数字时会出现重复拼接的问题,比如输入last200Days时得到last_20_00_days,原因是遍历数字时会重复处理相邻的数字字符,同时多分支逻辑存在执行冲突,导致输出异常。

最优解决方案:正则表达式实现

使用正则表达式可以精准匹配需要分隔的位置,代码简洁且不易出错:

import re

def format_string_case(string):
    # 将大写字母替换为「_小写字母」
    temp_str = re.sub(r'([A-Z])', r'_\1', string).lower()
    # 在字母与数字之间添加下划线
    temp_str = re.sub(r'([a-z])(\d)', r'\1_\2', temp_str)
    final_str = re.sub(r'(\d)([a-z])', r'\1_\2', temp_str)
    return final_str

测试验证

  • 输入:last20Days → 输出:last_20_days
  • 输入:last200Days → 输出:last_200_days
  • 输入:First100TestCases → 输出:first_100_test_cases

原代码问题修复(遍历实现)

如果不想使用正则,可通过遍历处理连续数字块来修复逻辑:

def format_string_case(string):
    res = []
    i = 0
    str_len = len(string)
    
    while i < str_len:
        current_char = string[i]
        
        # 处理大写字母:转小写并前置下划线
        if current_char.isupper():
            res.append('_')
            res.append(current_char.lower())
            i += 1
        
        # 处理连续数字块
        elif current_char.isnumeric():
            start_idx = i
            # 找到所有连续的数字
            while i < str_len and string[i].isnumeric():
                i += 1
            num_block = string[start_idx:i]
            
            # 数字块前是字母时,添加下划线
            if start_idx > 0 and string[start_idx-1].isalpha():
                res.append('_')
            res.append(num_block)
            
            # 数字块后是小写字母时,添加下划线
            if i < str_len and string[i].islower():
                res.append('_')
        
        # 处理小写字母:直接添加
        else:
            res.append(current_char)
            i += 1
    
    # 移除可能出现在开头的下划线
    return ''.join(res).lstrip('_')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:03:33