我设法使用正则表达式将一个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
答案 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()
在任何具有小写字符或数字的大写字符之前立即添加下划线,并将整个字符串转换为小写并返回。