例子:
>>> convert('CamelCase') 'camel_case'
import re name = 'CamelCaseName' name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower() print(name) # camel_case_name
如果你多次这样做并且上面的速度很慢,请事先编译正则表达式:
pattern = re.compile(r'(?<!^)(?=[A-Z])') name = pattern.sub('_', name).lower()
要专门处理更高级的情况(这不再可逆):
def camel_to_snake(name): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower() print(camel_to_snake('camel2_camel2_case')) # camel2_camel2_case print(camel_to_snake('getHTTPResponseCode')) # get_http_response_code print(camel_to_snake('HTTPResponseCodeXYZ')) # http_response_code_xyz
还要添加带有两个或更多下划线的大小写:
def to_snake_case(name): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) name = re.sub('__([A-Z])', r'_\1', name) name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', name) return name.lower()
name = 'snake_case_name' name = ''.join(word.title() for word in name.split('_')) print(name) # SnakeCaseName