例: 正则表达式
>>> convert('CamelCase') 'camel_case'
我已经很幸运了: app
import re def camelcase_to_underscore(s): return re.sub(r'(^|[a-z])([A-Z])', lambda m: '_'.join([i.lower() for i in m.groups() if i]), s)
若是您愿意的话,显然能够对速度进行一点点优化。 测试
import re CC2US_RE = re.compile(r'(^|[a-z])([A-Z])') def _replace(match): return '_'.join([i.lower() for i in match.groups() if i]) def camelcase_to_underscores(s): return CC2US_RE.sub(_replace, s)
不在标准库中,可是我发现此脚本彷佛包含您须要的功能。 优化
有趣的是: spa
>>> def un_camel(input): ... output = [input[0].lower()] ... for c in input[1:]: ... if c in ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'): ... output.append('_') ... output.append(c.lower()) ... else: ... output.append(c) ... return str.join('', output) ... >>> un_camel("camel_case") 'camel_case' >>> un_camel("CamelCase") 'camel_case'
或者,更多乐趣在于: code
>>> un_camel = lambda i: i[0].lower() + str.join('', ("_" + c.lower() if c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" else c for c in i[1:])) >>> un_camel("camel_case") 'camel_case' >>> un_camel("CamelCase") 'camel_case'
''.join('_'+c.lower() if c.isupper() else c for c in "DeathToCamelCase").strip('_') re.sub("(.)([A-Z])", r'\1_\2', 'DeathToCamelCase').lower()
一个使用正则表达式的可怕示例(您能够轻松清理掉:)): ip
def f(s): return s.group(1).lower() + "_" + s.group(2).lower() p = re.compile("([A-Z]+[a-z]+)([A-Z]?)") print p.sub(f, "CamelCase") print p.sub(f, "getHTTPResponseCode")
虽然适用于getHTTPResponseCode! underscore
或者,使用lambda: get
p = re.compile("([A-Z]+[a-z]+)([A-Z]?)") print p.sub(lambda x: x.group(1).lower() + "_" + x.group(2).lower(), "CamelCase") print p.sub(lambda x: x.group(1).lower() + "_" + x.group(2).lower(), "getHTTPResponseCode")
编辑:还应该很容易看到对于“测试”之类的案例还有改进的空间,由于下划线是无条件插入的。 input