如何在Python中将函数名转为友好命名?现有代码处理连续大写字符出错
修正驼峰命名转下划线格式的代码(处理连续大写字符)
需求回顾
需要将以get开头的驼峰式函数名转换为指定格式:
- 输入
getDataType→ 输出Data_Type - 输入
getDatasetID→ 输出Dataset_ID
原代码问题
原代码会给每个大写字母前都添加下划线,导致连续大写字符(如ID)被错误拆分,输出Dataset_I_D而非预期的Dataset_ID。
解决方案
方案1:遍历字符判断(直观易懂)
通过遍历每个字符,仅在「大写字母前是小写字母」的场景下添加下划线,避免连续大写字符被拆分:
def apiNames(funcName): name = funcName.split("get")[1] result = [] for idx, char in enumerate(name): if char.isupper(): # 只有当前大写字母的前一个字符是小写时,才添加下划线 if idx > 0 and name[idx-1].islower(): result.append('_') result.append(char) else: result.append(char) print(''.join(result)) # 测试 apiNames("getDataType") # 输出 Data_Type apiNames("getDatasetID") # 输出 Dataset_ID
方案2:正则表达式(简洁高效)
利用正则表达式的断言功能,精准匹配需要添加下划线的位置:
import re def apiNames(funcName): name = funcName.split("get")[1] # 匹配两种需要加下划线的场景: # 1. 小写字母紧跟大写字母(如 t → I) # 2. 连续大写字母的最后一个大写字母后跟小写字母(如 C → d,用于处理 ABCdef → ABC_def 的场景) formatted_name = re.sub(r'(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z])(?=[a-z])', r'_\1\2', name) print(formatted_name) # 测试 apiNames("getDataType") # 输出 Data_Type apiNames("getDatasetID") # 输出 Dataset_ID apiNames("getABCdef") # 输出 ABC_def(额外测试连续大写后跟小写的场景)
验证结果
两种方案都能正确处理示例中的场景,同时兼容连续大写字符后跟小写字母的边界情况。
内容的提问来源于stack exchange,提问作者Sushant Shelke
相关产品推荐
相关产品推荐

