Python recipe(7): 命名规则转换
代码何在?
Example Source Code [http://www.cnblogs.com/tomsheep/]
''' Created on 2010-5-21 @author: lk ''' import re,string #cw: capwords #us: underscore #mc: mixed-case #lw: lower-case def cw2us(x): return re.sub(r'(?<=[a-z])[A-Z]|(?<!^)[A-Z](?=[a-z])', r'_\g<0>', x).lower() def us2mc(x): return re.sub(r'_([a-z])', lambda match:match.group(1).upper(), x) def mc2us1(x): return cw2us(x) def us2cw(x): # return ''.join(map(string.capitalize,x.split('_'))) s = us2mc(x) return s[0].upper()+s[1:] def mc2cw1(x): return x[0].upper()+x[1:] def cw2mc1(x): return x[0].lower()+x[1:] def any2lw(x): lw = x.split('_') if(len(lw)>1): #underscore style return map(string.lower, lw) #otherwise pieces = re.split('([A-Z])',x) if pieces[0]:#begin with a non-capital char pieces = ['']+pieces #for the method below else: pieces = pieces[1:] return [pieces[i].lower()+pieces[i+1] for i in range(0, len(pieces), 2)] def lw2us(x):return '_'.join(x) def lw2cw(x):return ''.join(map(string.capitalize, x)) def lw2mc(x):return x[0]+lw2cw(x[1:]) def any2us(x): return lw2us(any2lw(x)) def any2cw(x): return lw2cw(any2lw(x)) def any2mc(x): return lw2mc(any2lw(x)) if __name__ == '__main__': x = "ILikeHTML" y = cw2us(x) z = us2mc(y) w = us2cw(y) print x,y,z,w # print re.split('([A-Z])',x) # print x.split('([A-Z])') print any2cw(x) print any2mc(x) print any2us(x) print any2lw(x)
以上代码改写自Python Cookbook 3-16
概述:
在不同的命名规则(如下划线分割法、驼峰法、词汇首字母大写法等)之间相互转换。给出两套方案:第一种利用re模块一对一地转换,这种方法不太具有拓展性,一旦命名规则种类增多,需添加大量转换函数;第二种提供了一种通用的中间形式,即小写list,只需提供各种命名规则与小写list之间的转换规则即可。(本代码第二种实现与第一种效果略有不同,主要体现在连续大写字母的处理上)
代码说明:
1.正则表达式中的“0宽断言”:
(?=exp): 在断言自身后匹配exp
(?>=exp): 在断言自身前匹配exp
(?!exp): 在断言自身后不能出现exp匹配
(?<!exp)在断言自身前不能出现exp匹配
更多正则表达式资料见:正则表达式30分钟入门教程
2.在cw2us函数中,使用re.sub函数时第二个参数传了 r’_\g<0>’, 这里的g<0>既表示match.group(0)
3.re.split和string对象的split区别在于后者不能使用正则表达式……汗,原来先入为主以为可以……
4.过去一直想为什么很多对象已经提供的函数,模块又要提供一遍,比如re和string;现在感觉也许一定程度是为了书写便捷,比如map用起来很方便(- -|||露怯……随着学习深入以后应该会有新的认识……)