python函数将驼峰案例转换为蛇案例

时间:2014-01-16 18:21:01

标签: python regex

我设法使用正则表达式将一个python函数拼凑起来将camel转换为snake case,它适用于我的所有测试用例,但我还有几个问题。

1)三个陈述中的每一个实际上做了什么?

import re

test_cases = list()
test_cases.append('camelCase')
test_cases.append('camelCaseCase')
test_cases.append('camel2Case')
test_cases.append('camel12Case')
test_cases.append('camel12Case')
test_cases.append('camelCaseURL')
test_cases.append('camel2CaseURL')
test_cases.append('camel12CaseURL')
test_cases.append('camel12Case2URL')
test_cases.append('camel12Case12URL')
test_cases.append('CamelCase')
test_cases.append('CamelCaseCase')
test_cases.append('URLCamelCase')


def camel_to_snake(string):
    string = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', string)
    string = re.sub('(.)([0-9]+)', r'\1_\2', string)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).lower()


for string in test_cases:
    print(string + ' -> ' + camel_to_snake(string))

结果是:

camelCase -> camel_case
camelCaseCase -> camel_case_case
camel2Case -> camel_2_case
camel12Case -> camel_12_case
camel12Case -> camel_12_case
camelCaseURL -> camel_case_url
camel2CaseURL -> camel_2_case_url
camel12CaseURL -> camel_12_case_url
camel12Case2URL -> camel_12_case_2_url
camel12Case12URL -> camel_12_case_12_url
CamelCase -> camel_case
CamelCaseCase -> camel_case_case
URLCamelCase -> url_camel_case

1 个答案:

答案 0 :(得分:7)

首先回答你的第二个问题,这似乎是完成这项任务的一种非常合理的方式,但它可能不像其他方法那样可维护,因为它很难弄清楚它是如何工作的。

以下是各行的细分:

  • string = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', string)
    在每个单个大写字符之前添加一个下划线,后跟一个或多个小写字符,但在字符串的开头除外。

  • string = re.sub('(.)([0-9]+)', r'\1_\2', string)
    在任何连续数字组之前立即添加下划线,但在字符串的开头除外。

  • return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).lower()
    在任何具有小写字符或数字的大写字符之前立即添加下划线,并将整个字符串转换为小写并返回。