将 CamelCase 转换为 snake_case 的优雅 Python 函数?

新手上路,请多包涵

例子:

 >>> convert('CamelCase')
'camel_case'

原文由 Sridhar Ratnakumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

骆驼案到蛇案

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

原文由 epost 发布,翻译遵循 CC BY-SA 4.0 许可协议

包索引中有一个 变形库 可以为您处理这些事情。在这种情况下,您将寻找 inflection.underscore()

 >>> inflection.underscore('CamelCase')
'camel_case'

原文由 Brad Koch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏