我有几个虚拟函数名,我想转换它们如下:
示例案例1
input : getDataType
output: Data_Type
示例案例2
input: getDatasetID
output: Dataset_ID
我的代码如下:
def apiNames(funcName):
name = funcName.split("get")[1]
print(''.join('_' + char if char.isupper() else char
for char in name).lstrip('_'))
apiNames("getDataType")
apiNames("getDatasetID")
适用于情形1,但不适用于情形2
case 1输出:
Data_Type
case 2输出:
Dataset_I_D
只是为了好玩,这里有一个更健壮的camelCASEParser
,它可以处理所有的"角落情况"。一点点的前瞻性会有很长的路要走。
>>> pattern = '^[a-z]+|[A-Z][a-z]+|[A-Z]+(?![a-z])'
>>> "_".join(re.findall(pattern, "firstWordsUPPERCASECornerCasesEtc"))
'first_Words_UPPERCASE_Corner_Cases_Etc'
是的,如果模式以大写span结束,它也可以工作。
>>> "_".join(re.findall(pattern, "andAShortPS"))
'and_A_Short_PS'
我很确定它适用于任何匹配^[a-zA-Z]+
的序列。试试。
我认为regex是解决这个问题的更好途径。
考虑:
def apiNames(funcName):
name = funcName.split("get")[1]
print('_'.join([found for found in re.findall(r'[A-Z]*[a-z]*', name)][:-1]))