332 Stimmen

Elegante Python-Funktion zur Umwandlung von CamelCase in snake_case?

Exemple :

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

1voto

Salvatore Punkte 61

Leicht angepasst von https://stackoverflow.com/users/267781/matth die Generatoren verwenden.

def uncamelize(s):
    buff, l = '', []
    for ltr in s:
        if ltr.isupper():
            if buff:
                l.append(buff)
                buff = ''
        buff += ltr
    l.append(buff)
    return '_'.join(l).lower()

1voto

Matthew Iselin Punkte 10054

Ein grauenhaftes Beispiel für die Verwendung regulärer Ausdrücke (Sie könnten einfach bereinigen Sie das :) ):

def f(s):
    return s.group(1).lower() + "_" + s.group(2).lower()

p = re.compile("([A-Z]+[a-z]+)([A-Z]?)")
print p.sub(f, "CamelCase")
print p.sub(f, "getHTTPResponseCode")

Funktioniert aber für getHTTPResponseCode!

Alternativ können Sie mit lambda:

p = re.compile("([A-Z]+[a-z]+)([A-Z]?)")
print p.sub(lambda x: x.group(1).lower() + "_" + x.group(2).lower(), "CamelCase")
print p.sub(lambda x: x.group(1).lower() + "_" + x.group(2).lower(), "getHTTPResponseCode")

EDIT: Es sollte auch ziemlich einfach zu sehen sein, dass es Raum für Verbesserungen für Fälle wie "Test" gibt, weil der Unterstrich unbedingt eingefügt wird.

1voto

Mathieu Rodic Punkte 6409

Mit dieser einfachen Methode sollte es klappen:

import re

def convert(name):
    return re.sub(r'([A-Z]*)([A-Z][a-z]+)', lambda x: (x.group(1) + '_' if x.group(1) else '') + x.group(2) + '_', name).rstrip('_').lower()
  • Wir suchen nach Großbuchstaben, denen eine beliebige Anzahl von Großbuchstaben (oder Null) vorausgeht und auf die eine beliebige Anzahl von Kleinbuchstaben folgt.
  • Ein Unterstrich wird direkt vor dem letzten Großbuchstaben der Gruppe gesetzt, und ein Unterstrich kann vor diesem Großbuchstaben gesetzt werden, wenn ihm andere Großbuchstaben vorausgehen.
  • Falls nachstehende Unterstriche vorhanden sind, entfernen Sie diese.
  • Schließlich wird die gesamte Ergebniszeichenfolge in Kleinbuchstaben umgewandelt.

(entnommen aus ici siehe Arbeitsbeispiel online )

1voto

Jmini Punkte 8309

Sehr schöner RegEx-Vorschlag zu diese Seite :

(?<!^)(?=[A-Z])

Wenn Python eine String Split-Methode haben, sollte es funktionieren...

In Java:

String s = "loremIpsum";
words = s.split("(?&#60;!^)(?=[A-Z])");

0voto

bibmartin Punkte 1

Ohne eine Bibliothek :

def camelify(out):
    return (''.join(["_"+x.lower() if i<len(out)-1 and x.isupper() and out[i+1].islower()
         else x.lower()+"_" if i<len(out)-1 and x.islower() and out[i+1].isupper()
         else x.lower() for i,x in enumerate(list(out))])).lstrip('_').replace('__','_')

Ein bisschen schwer, aber

CamelCamelCamelCase ->  camel_camel_camel_case
HTTPRequest         ->  http_request
GetHTTPRequest      ->  get_http_request
getHTTPRequest      ->  get_http_request

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