我设法用正则表达式拼凑出一个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
首先回答您的第二个问题,这似乎是完成此任务的一个非常合理的方法,但它可能不像其他方法那样易于维护,因为很难弄清楚它是如何工作的。
下面是每一行所做的细分:
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()
在前面有小写字符或数字的任何大写字符之前添加下划线,并将整个字符串转换为小写并返回。
相关问题 更多 >
编程相关推荐