将蛇皮套转换成小驼峰皮套(lowerCamelCase)


79

my_string在python 2.7中从蛇格()转换为小驼峰(myString)的好方法是什么?

显而易见的解决方案是用下划线分隔,将第一个单词以外的每个单词大写,然后重新组合在一起。

但是,我对其他更惯用的解决方案或RegExp实现此目的的方式感到好奇(带有一些大小写修饰符?)


据我所知,没有什么可以实现这一点的。您是否尝试实施自己的解决方案?
弗雷德里克·哈米迪

编辑了我的问题,我知道没有内置的,我想找到一个不错的实现
luca 2013年

我认为这个问题绝不是“题外话”。
2015年

Answers:


141
def to_camel_case(snake_str):
    components = snake_str.split('_')
    # We capitalize the first letter of each component except the first one
    # with the 'title' method and join them together.
    return components[0] + ''.join(x.title() for x in components[1:])

例:

In [11]: to_camel_case('snake_case')
Out[11]: 'snakeCase'

11
camelCasing还适用于哪些其他数据类型?
jbaiter '16

20
好吧,这不是真正惯用的Python,它通常遵循“比许可更容易请求宽恕”的原则。使用> 3.5时,如果需要类型安全性,则可以添加类型提示,但是使用if-else进行类型检查,以检查像这样清晰的函数(除了字符串还可以使用camelCase吗?)只是样式不好而且过多我这本书中的详细程度。
jbaiter

2
只是想在这里第二个。to_camel_case确保输入为字符串不是责任,而是调用代码的责任。传递非字符串将引发异常,这很好。那就是例外。
kylebebak

@stelios甚至没有。空字符串呢?否则您会怎么做?因为这样您就返回了None。您无法防止任何单个错误。如果尝试使用它,则只会掩盖其来源。那是Python,而不是Java。您不必避免例外,而必须对待它们。
努诺·安德烈

1
有点_barbarBarcomponents = snake_str.lstrip('_').split('_')
棘手的

15

这是另一种方法,仅适用于Python 3.5及更高版本:

def camel(snake_str):
    first, *others = snake_str.split('_')
    return ''.join([first.lower(), *map(str.title, others)])

生成器可以使用时不要使用列表理解(即join(...)join([...])这里更好,因为它无需创建列表即可工作)。
VedranŠego'18

2
您是完全正确的,但是这不适用于这种特殊情况,因为传递给该join方法的不是理解而是常规列表。如果要避免创建内存列表,可以使用use itertools.chain,但是如果在将蛇形转换为驼峰式大小写时担心内存占用,则会遇到更大的问题。;-)
Berislav Lopac

抱歉,我读错了(因为我是在这里寻找PascalCase而不是camelCase的)。不,很好。
VedranŠego18年


5
>>> snake_case = "this_is_a_snake_case_string"
>>> l = snake_case.split("_")
>>> print l[0] + "".join(map(str.capitalize, l[1:]))
'thisIsASnakeCaseString'

4

另外一个班轮

def to_camel_case(snake_string):
    return snake_string.title().replace("_", "")

3
第一个字符是大写。
SiHa 2016年

3

有点晚了,但是几天前我在/ r / python上找到了这个:

pip install pyhumps

然后您可以执行以下操作:

import humps

humps.camelize('jack_in_the_box')  # jackInTheBox
# or
humps.decamelize('rubyTuesdays')  # ruby_tuesdays
# or
humps.pascalize('red_robin')  # RedRobin

1

以史蒂夫的答案为基础,此版本应该可以工作:

def to_camel_case(snake_case_string):
    titleCaseVersion =  snake_case_string.title().replace("_", "")
    camelCaseVersion = titleCaseVersion[0].lower() + titleCaseVersion[1:]
    return camelCaseVersion

1

这是使用正则表达式的解决方案:

import re

def snake_to_camel(text):
    return re.sub('_([a-zA-Z0-9])', lambda m: m.group(1).upper(), text)


0

不使用列表推导:

def snake_to_camel_case(text_snake):
    return '{}{}'.format(
        text_snake[:1].lower(),
        text_snake.title().replace('_', '')[1:],
    )

0

所以我需要将带有蛇形大小写参数的整个文件转换为驼峰式大小写。Mathieu Rodic的解决方案效果最好。谢谢。

这是一个在文件上使用它的小脚本。

import re

f = open("in.txt", "r")
words = f.read()

def to_camel_case3(s):
    return re.sub(r'_([a-z])', lambda x: x.group(1).upper(), s)

f = open("out.txt", "w")
f.write(to_camel_case3(words))

0
def toCamel(snake)
    return ''.join( word.capitalize()
                    for word in snake.split('_') )

允许下划线由前面的下划线转义(例如,“ Escaped__snake”将变为“ Escaped_Snake”,而“ usual_snake”将变为“ UsualSnake”。包括对空白的三进制测试。

def toCamel(escaped_snake)
    return ''.join( (word.capitalize(), '_')[word=='')
                    for word in escaped_snake.split('_') )

不要大写第一段(即,“ tHERE_is_a_snake”变成“ thereIsASnake”)

def toCamel(esCAPed_snake)
    words = esCAPed_snake.split('_')
    return words[0].lower() + ''.join( (word.capitalize(), '_')[word=='')
                                       for word in words[1:] )

-2

tocamelcase可以轻松地从蛇皮转换为骆驼皮。

安装

$ pip install tocamelcase

然后您可以像这样使用它:

import tocamelcase

print(tocamelcase.convert("non_camel_case"))
# -> non_camel_case → NonCamelCase

也存在decamelize与该模块相反的情况。


这是PascalCase,所以甚至模块名称也令人误解。
stasdeep
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.