web-dev-qa-db-fra.com

Conversion de Snake Case en Lower Camel Case (lowerCamelCase)

Quel serait un bon moyen de convertir cas de serpent (my_string) en cas de chameau inférieur (myString) dans Python 2.7?

La solution évidente consiste à séparer par un trait de soulignement, à mettre en majuscule chaque mot sauf le premier et à le rejoindre.

Cependant, je suis curieux de connaître d’autres solutions plus idiomatiques ou un moyen d’utiliser RegExp pour y parvenir (avec un modificateur de casse?)

48
luca
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:])

Exemple:

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

Voici encore une autre prise, qui ne fonctionne que dans Python 3.5:

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

One-liner obligatoire:

import string

def to_camel_case(s):
    return s[0].lower() + string.capwords(s, sep='_').replace('_', '')[1:] if s else s
5
Simeon Visser
>>> snake_case = "this_is_a_snake_case_string"
>>> l = snake_case.split("_")
>>> print l[0] + "".join(map(str.capitalize, l[1:]))
'thisIsASnakeCaseString'
3
Leon Young

un autre one liner

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

S'appuyant sur la réponse de Steve, cette version devrait fonctionner:

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

Voici une solution utilisant des expressions régulières:

import re

def snake_to_camel(text):
    return re.sub('_([a-zA-Z0-9])', lambda m: m.group(1).upper(), text)
1
Antoine Pinsard
def to_camel_case(snake_str):
    components = snake_str.split('_')
    return reduce(lambda x, y: x + y.title(), components[1:], components[0])
0
Chandler Childs

Sans utiliser les compréhensions de liste:

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

Il existe également tocamelcase pour convertir facilement un étui de serpent en étui de chameau.

Installer

$ pip install tocamelcase

et ensuite vous pouvez l'utiliser comme ceci:

import tocamelcase

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

Il y a aussi decamelize qui est l'inverse de ce module.

0
Carlos Abraham

Un peu tard, mais j'ai trouvé ceci sur/r/python il y a quelques jours:

pip install pyhumps

et alors vous pouvez simplement faire:

import humps

humps.camelize('jack_in_the_box')  # jackInTheBox
# or
humps.decamelize('rubyTuesdays')  # Ruby_tuesdays
# or
humps.pascalize('red_robin')  # RedRobin
0
Glenn Dills

J'ai donc eu besoin de convertir un fichier entier avec un tas de paramètres de cas de serpent en cas de chameau. La solution de Mathieu Rodic a fonctionné mieux. Merci.

Voici un petit script pour l'utiliser sur des fichiers.

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
Mike Starov