例: 正則表達式
>>> 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