首页 > Python > Python实现驼峰与下划线互转

Python实现驼峰与下划线互转

在python中PEP8 Python 编码规范推荐使用下划线对变量名,方法名进行命名,但是从Java转过来的命名方式很难改变,有时候就需要让驼峰与下划线互转。

@classmethod
def ltrim(cls, haystack, left=""):
    if cls.isEmpty(haystack):
        return haystack
    elif cls.isEmpty(left):
        return haystack.lstrip()
    else:
        return haystack.lstrip(left)
        
@classmethod
def camelize(cls, uncamelized, separator="_"):
	uncamelized = separator + uncamelized.lower().replace(separator, " ")
	return cls.ltrim(string.capwords(uncamelized).replace(" ", ""), separator)

@classmethod
def uncamelize(cls, camelCaps, separator="_"):
	pattern = re.compile(r'([A-Z]{1})')
	sub = re.sub(pattern, separator+r'\1', camelCaps).lower()
	return sub


需要依赖re(用于正则替换)、string模块(用于让一句英文单词首字母大写),还需要实现ltrim方法(去除指定字符)。


如果换做是php、js,同样的原理实现代码如下:

/**
 * 下划线转驼峰
 * 思路:
 * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
 * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
*/
function camelize($uncamelized, $separator='_') {
	$uncamelized = $separator. str_replace($separator, " ", strtolower($uncamelized));
	return ltrim(str_replace(" ", "", ucwords($uncamelized)), $separator);
}

/**
 * 驼峰命名转下划线命名
 * 思路:
 * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
*/
function uncamelize($camelCaps, $separator='_') {
	$uncamelized = preg_replace('/([A-Z]{1})/', $separator . "$1", $camelCaps);
	return strtolower($uncamelized);
}

/**
 * 驼峰命名转下划线命名
 * 思路:
 * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
*/
function uncamelize2($camelCaps, $separator='_') {
	$uncamelized = preg_replace_callback('/([A-Z]{1})/',function($matches) use($separator) {
        return $separator.strtolower($matches[0]);
    }, $camelCaps);
	return $uncamelized;
}


js实现:

	function ucwords(str) {
		return str.substring(0,1).toUpperCase().concat(str.substring(1));  
	}
	
	/**
	 * 用于让一句英文单词首字母大写
	 */
	function capwords(str) {
		return str.toLowerCase().replace(/\b([\w|']+)\b/g, function(word) {  
			return word.replace(word.charAt(0), word.charAt(0).toUpperCase());  
		});
	}
	
	/**
	 * 去除指定字符
	 */
	function ltrim(str, delimiter) {
		if(delimiter == 'undefinded') {
			delimiter = ' ';
		}
		var i;
		for(i=0;i<str.length;i++) {
			if(str.charAt(i)!=delimiter&&str.charAt(i)!=delimiter)break;
		}
		str=str.substring(i,str.length);
		return str;
	}
	
	/**
	 * 下划线转驼峰
	 * 思路:
	 * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
	 * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
	*/
	function camelize(uncamelized, separator) {
		if("undefined" == typeof(separator)) {
			separator = "_";
		}
		var uncamelized = separator + uncamelized.toLowerCase().replace(separator, "");
		return ltrim(capwords(uncamelized).replace(" ", ""), separator);
	}
	
	/**
	 * 驼峰命名转下划线命名
	 * 思路:
	 * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
	*/
	function uncamelize(camelCaps, separator) {
		if("undefined" == typeof(separator)) {
			separator = "_";
		}
		var uncamelized = camelCaps.replace(/([A-Z]{1})/g, separator + "$1");
		return uncamelized.toLowerCase();
	}
	
	function uncamelize2(camelCaps, separator) {
		if("undefined" == typeof(separator)) {
			separator = "_";
		}
		// replace只替换一次进回调, 加上g之后全部进回调
		var uncamelized = camelCaps.replace(/([A-Z]{1})/g, function(){
			return separator + arguments[0].toLowerCase();
		});
		return uncamelized;
	}



教程地址:http://blog.zhengshuiguang.com/python/camelizeUnderscore.html

欢迎转载!但请带上文章地址^^

标签:驼峰 下划线

评论已关闭