332 Stimmen

Elegante Python-Funktion zur Umwandlung von CamelCase in snake_case?

Exemple :

>>> convert('CamelCase')
'camel_case'

3voto

gahooa Punkte 121696

Aus Spaß an der Freude:

>>> def un_camel(input):
...     output = [input[0].lower()]
...     for c in input[1:]:
...             if c in ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
...                     output.append('_')
...                     output.append(c.lower())
...             else:
...                     output.append(c)
...     return str.join('', output)
...
>>> un_camel("camel_case")
'camel_case'
>>> un_camel("CamelCase")
'camel_case'

Oder, mehr zum Spaß:

>>> un_camel = lambda i: i[0].lower() + str.join('', ("_" + c.lower() if c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" else c for c in i[1:]))
>>> un_camel("camel_case")
'camel_case'
>>> un_camel("CamelCase")
'camel_case'

3voto

3k- Punkte 2257

Die Verwendung von Regexen ist zwar die kürzeste, aber diese Lösung ist wesentlich lesbarer:

def to_snake_case(s):
    snake = "".join(["_"+c.lower() if c.isupper() else c for c in s])
    return snake[1:] if snake.startswith("_") else snake

3voto

jdavidls Punkte 348

Dies ist keine elegante Methode, ist eine sehr "Low-Level"-Implementierung eines einfachen Zustandsautomaten (Bitfeld-Zustandsautomat), möglicherweise die anti-pythonischen Modus, um dies zu lösen, jedoch re Modul implementiert auch eine zu komplexe Zustandsmaschine, um diese einfache Aufgabe zu lösen, so dass ich denke, dies ist eine gute Lösung.

def splitSymbol(s):
    si, ci, state = 0, 0, 0 # start_index, current_index 
    '''
        state bits:
        0: no yields
        1: lower yields
        2: lower yields - 1
        4: upper yields
        8: digit yields
        16: other yields
        32 : upper sequence mark
    '''
    for c in s:

        if c.islower():
            if state & 1:
                yield s[si:ci]
                si = ci
            elif state & 2:
                yield s[si:ci - 1]
                si = ci - 1
            state = 4 | 8 | 16
            ci += 1

        elif c.isupper():
            if state & 4:
                yield s[si:ci]
                si = ci
            if state & 32:
                state = 2 | 8 | 16 | 32
            else:
                state = 8 | 16 | 32

            ci += 1

        elif c.isdigit():
            if state & 8:
                yield s[si:ci]
                si = ci
            state = 1 | 4 | 16
            ci += 1

        else:
            if state & 16:
                yield s[si:ci]
            state = 0
            ci += 1  # eat ci
            si = ci   
        print(' : ', c, bin(state))
    if state:
        yield s[si:ci] 

def camelcaseToUnderscore(s):
    return '_'.join(splitSymbol(s)) 

splitsymbol kann alle Groß- und Kleinschreibungstypen parsen: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS und cammelCasedMethods

Ich hoffe, es ist nützlich

2voto

unitto Punkte 23

So viele komplizierte Methoden... Finden Sie einfach alle "Titled"-Gruppen und fügen Sie deren kleingeschriebene Variante mit Unterstrich zusammen.

>>> import re
>>> def camel_to_snake(string):
...     groups = re.findall('([A-z0-9][a-z]*)', string)
...     return '_'.join([i.lower() for i in groups])
...
>>> camel_to_snake('ABCPingPongByTheWay2KWhereIsOurBorderlands3???')
'a_b_c_ping_pong_by_the_way_2_k_where_is_our_borderlands_3'

Wenn Sie die Zahlen nicht als erstes Zeichen der Gruppe oder als separate Gruppe verwenden möchten, können Sie ([A-z][a-z0-9]*) Maske.

2voto

Iain Hunter Punkte 3275

Werfen Sie einen Blick auf die ausgezeichnete Schematics lib

https://github.com/schematics/schematics

Es erlaubt Ihnen, typisierte Datenstrukturen zu erstellen, die von Python zu Javascript Flavour serialisieren/deserialisieren können, z.B:

class MapPrice(Model):
    price_before_vat = DecimalType(serialized_name='priceBeforeVat')
    vat_rate = DecimalType(serialized_name='vatRate')
    vat = DecimalType()
    total_price = DecimalType(serialized_name='totalPrice')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X