94

在 Python 2.7 中从蛇形大小写 ( my_string) 转换为小驼形大小写 (myString) 的好方法是什么?

显而易见的解决方案是用下划线分割,将除第一个单词之外的每个单词大写,然后重新连接在一起。

但是,我很好奇其他更惯用的解决方案或RegExp用于实现此目的的方法(使用一些案例修饰符?)

4

15 回答 15

178
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'
于 2013-09-27T14:52:41.520 回答
17

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

def camel(snake_str):
    first, *others = snake_str.split('_')
    return ''.join([first.lower(), *map(str.title, others)])
于 2017-02-24T23:57:31.883 回答
12

这有点晚了,但我几天前在 /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
于 2018-11-06T16:41:09.590 回答
9

强制单行:

import string

def to_camel_case(s):
    return s[0].lower() + string.capwords(s, sep='_').replace('_', '')[1:] if s else s
于 2013-09-27T14:56:16.223 回答
5
>>> snake_case = "this_is_a_snake_case_string"
>>> l = snake_case.split("_")
>>> print l[0] + "".join(map(str.capitalize, l[1:]))
'thisIsASnakeCaseString'
于 2013-09-27T14:54:48.817 回答
5

另一个班轮

def to_camel_case(snake_string):
    return snake_string.title().replace("_", "")
于 2016-01-07T12:55:28.607 回答
3

对于单线粉丝..

''.join((wd.title() if i else wd) for (i,wd) in enumerate(string.split('_')))
于 2021-05-16T15:40:55.210 回答
2
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:] )
于 2020-02-05T07:58:47.113 回答
2

基于史蒂夫的回答,这个版本应该可以工作:

def to_camel_case(snake_case_string):
    titleCaseVersion =  snake_case_string.title().replace("_", "")
    camelCaseVersion = titleCaseVersion[0].lower() + titleCaseVersion[1:]
    return camelCaseVersion
于 2016-04-05T14:58:38.520 回答
1

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

import re

def snake_to_camel(text):
    return re.sub('_([a-zA-Z0-9])', lambda m: m.group(1).upper(), text)
于 2017-11-12T20:14:48.623 回答
1

pydash熟悉的可以使用lodash

pip install pydash第一的。

import pydash  # pip install pydash

assert pydash.snake_case("WriteLine") == "write_line"
assert pydash.snake_case("writeLine") == "write_line"
assert pydash.camel_case("write_line") == "writeLine"
assert pydash.upper_first(pydash.camel_case("write_line")) == "WriteLine"

https://github.com/dgilland/pydash

https://pydash.readthedocs.io/en/latest/

https://pypi.org/project/pydash/

于 2022-01-05T05:09:18.663 回答
0

这太简单了?

snake_case 已经是小写了。my_string

因此,如果我们为字符串命名并删除下划线MyString

然后将第一个字符替换为我们完成M的原始字符。m

scase = "my_string"
ccase = scase[0] + scase.title().replace('_', '')[1:]

输出: myString

于 2022-02-05T15:18:51.793 回答
0
def to_camel_case(snake_str):
    components = snake_str.split('_')
    return reduce(lambda x, y: x + y.title(), components[1:], components[0])
于 2018-01-29T23:17:50.190 回答
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))
于 2019-02-28T17:25:53.140 回答
0

不使用列表推导:

def snake_to_camel_case(text_snake):
    return '{}{}'.format(
        text_snake[:1].lower(),
        text_snake.title().replace('_', '')[1:],
    )
于 2018-07-31T23:43:01.853 回答