Beispiel:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
quelle
quelle
NotCamelCase
aberthisIs
Antworten:
Kamelkoffer zu Schlangenkoffer
Wenn Sie dies viele Male tun und das oben Gesagte langsam ist, kompilieren Sie den regulären Ausdruck im Voraus:
Speziell für fortgeschrittenere Fälle (dies ist nicht mehr umkehrbar):
Schlangenkoffer zu Kamelkoffer
quelle
not_camel_case
innotCamelCase
und / oderNotCamelCase
?s2.replace('__', '_')
Es gibt eine Flexionsbibliothek im Paketindex, die diese Dinge für Sie erledigen kann. In diesem Fall würden Sie suchen
inflection.underscore()
:quelle
Ich weiß nicht, warum das alles so kompliziert ist.
für die meisten Fälle, die einfachen Ausdruck
([A-Z]+)
den TrickUm das erste Zeichen zu ignorieren, fügen Sie einfach einen Blick nach hinten hinzu
(?!^)
Wenn Sie ALLCaps von all_caps trennen möchten und Zahlen in Ihrer Zeichenfolge erwarten möchten, müssen Sie immer noch nicht zwei separate Läufe ausführen. Verwenden Sie einfach.
|
Dieser Ausdruck((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
kann nahezu jedes Szenario im Buch verarbeitenEs hängt alles davon ab, was Sie möchten. Verwenden Sie daher die Lösung, die Ihren Anforderungen am besten entspricht, da sie nicht zu kompliziert sein sollte.
nJoy!
quelle
(?!^)
Ausdruck, der als Rückblick bezeichnet wurde. Wenn ich nichts vermisse, wollen wir hier wirklich einen negativen Rückblick, der ausgedrückt werden sollte als(?<!^)
. Aus Gründen, die ich nicht verstehen kann,(?!^)
scheint Ihr negativer Ausblick auch zu funktionieren ..."Camel2WARNING_Case_CASE"
wird"camel2_warning_case__case"
. Sie können ein(?<!_)
negatives Aussehen hinzufügen , um es zu lösen:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
Rückkehr'camel2_warning_case_case'
(?!^)
wurde fälschlicherweise als "Blick nach hinten" bezeichnet und hätte stattdessen als negative Lookahead-Behauptung bezeichnet werden sollen . Wie diese nette Erklärung zeigt, kommen negative Lookaheads normalerweise nach dem Ausdruck , nach dem Sie suchen. Sie können sich also(?!^)
als "Finden,''
wo<start of string>
nicht folgt" vorstellen. In der Tat funktioniert auch ein negativer Lookbehind: Sie können sich vorstellen,(?<!^)
"herauszufinden,''
wo<start of string>
nicht vorangeht".stringcase ist dafür meine Anlaufstelle ; z.B:
quelle
Persönlich bin ich mir nicht sicher, wie etwas, das reguläre Ausdrücke in Python verwendet, als elegant beschrieben werden kann. Die meisten Antworten hier machen nur RE-Tricks vom Typ "Code Golf". Elegante Codierung soll leicht verständlich sein.
quelle
+=
auf Saiten ist fast immer eine schlechte Idee. An eine Liste anhängen und''.join()
am Ende. Oder in diesem Fall einfach mit einem Unterstrich verbinden ...Ich vermeide es
re
wenn möglich:quelle
re
Bibliothek zu verwenden und das Zeug nur in einer Zeile zu erledigen, nur mit eingebauten str.methods! Es ähnelt dieser Antwort , vermeidet jedoch das Verwenden von Slicing und zusätzlichem,if ... else
indem möglicherweise das potenziell hinzugefügte "_" als erstes Zeichen entfernt wird. Das gefällt mir am besten.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
aber für diese Antwort,2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
die 2,5x schneller ist! Ich liebe das!quelle
Ich denke, diese Lösung ist einfacher als frühere Antworten:
Welche Ausgänge:
Der reguläre Ausdruck entspricht drei Mustern:
[A-Z]?[a-z]+
: Aufeinanderfolgende Kleinbuchstaben, die optional mit einem Großbuchstaben beginnen.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Zwei oder mehr aufeinanderfolgende Großbuchstaben. Es verwendet einen Lookahead, um den letzten Großbuchstaben auszuschließen, wenn ihm ein Kleinbuchstabe folgt.\d+
: Fortlaufende Nummern.Durch die Verwendung erhalten
re.findall
wir eine Liste einzelner "Wörter", die in Kleinbuchstaben umgewandelt und mit Unterstrichen verbunden werden können.quelle
Ich habe keine Ahnung, warum beide .sub () -Aufrufe verwendet werden. :) Ich bin kein Regex-Guru, aber ich habe die Funktion auf diese vereinfacht, die für meine bestimmten Bedürfnisse geeignet ist. Ich brauchte nur eine Lösung, um camelCasedVars von der POST-Anfrage in vars_with_underscore zu konvertieren:
Es funktioniert nicht mit Namen wie getHTTPResponse, weil ich gehört habe, dass es sich um eine schlechte Namenskonvention handelt (sollte wie getHttpResponse sein, es ist offensichtlich, dass es viel einfacher ist, sich dieses Formular zu merken).
quelle
'HTTPConnectionFactory'
, Ihr Code erzeugt'h_tt_pconnection_factory'
, Code aus akzeptierter Antwort erzeugt'http_connection_factory'
Hier ist meine Lösung:
Es unterstützt die in den Kommentaren diskutierten Eckfälle. Zum Beispiel wird es so konvertiert
getHTTPResponseCode
,get_http_response_code
wie es sollte.quelle
Spaßeshalber:
Oder mehr zum Spaß:
quelle
str.join
ist seit Ewigkeiten veraltet . Verwenden Sie''.join(..)
stattdessen.Die Verwendung von regulären Ausdrücken mag am kürzesten sein, aber diese Lösung ist viel besser lesbar:
quelle
So viele komplizierte Methoden ... Finden Sie einfach alle "Betitelten" Gruppen und verbinden Sie die Variante mit dem unteren Gehäuse mit Unterstrich.
Wenn Sie keine Zahlen wie das erste Zeichen einer Gruppe oder eine separate Gruppe erstellen möchten, können Sie die
([A-z][a-z0-9]*)
Maske verwenden.quelle
Nicht in der Standardbibliothek, aber ich habe dieses Skript gefunden , das anscheinend die Funktionen enthält, die Sie benötigen.
quelle
Dies ist keine elegante Methode, sondern eine Implementierung einer einfachen Zustandsmaschine (Bitfeld-Zustandsmaschine) auf sehr niedriger Ebene, möglicherweise der anti-pythonischste Modus, um dies zu beheben. Das Modul re implementiert jedoch auch eine zu komplexe Zustandsmaschine, um diese einfache zu lösen Aufgabe, also denke ich, dass dies eine gute Lösung ist.
splitsymbol kann alle Falltypen analysieren: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS und cammelCasedMethods
Ich hoffe es ist nützlich
quelle
Leicht angepasst von https://stackoverflow.com/users/267781/matth , die Generatoren verwenden.
quelle
Schauen Sie sich die exzellente Schematics lib an
https://github.com/schematics/schematics
Sie können typisierte Datenstrukturen erstellen, die von Python nach Javascript serialisiert / deserialisiert werden können, z.
quelle
Diese einfache Methode sollte den Job erledigen:
(von hier aus siehe Online-Arbeitsbeispiel )
quelle
Wow, ich habe das gerade aus Django-Schnipsel gestohlen. ref http://djangosnippets.org/snippets/585/
Ziemlich elegant
Beispiel:
Kehrt zurück:
REGEX DEMO
quelle
Ein schreckliches Beispiel mit regulären Ausdrücken (Sie könnten leicht bereinigen :)):
Funktioniert aber für getHTTPResponseCode!
Alternativ mit Lambda:
BEARBEITEN: Es sollte auch ziemlich leicht zu erkennen sein, dass in Fällen wie "Test" Verbesserungspotenzial besteht, da der Unterstrich unbedingt eingefügt wird.
quelle
Hier ist etwas, was ich getan habe, um die Header einer durch Tabulatoren getrennten Datei zu ändern. Ich lasse den Teil weg, in dem ich nur die erste Zeile der Datei bearbeitet habe. Sie können es mit der Re-Bibliothek ziemlich einfach an Python anpassen. Dies beinhaltet auch das Trennen von Zahlen (hält aber die Ziffern zusammen). Ich habe es in zwei Schritten gemacht, weil das einfacher war, als zu sagen, dass am Anfang einer Zeile oder eines Tabulators kein Unterstrich gesetzt werden soll.
Erster Schritt ... Suchen Sie Großbuchstaben oder Ganzzahlen, denen Kleinbuchstaben vorangestellt sind, und stellen Sie ihnen einen Unterstrich voran:
Suche:
Ersatz:
Schritt 2 ... Nehmen Sie die obigen Schritte und führen Sie sie erneut aus, um alle Großbuchstaben in Kleinbuchstaben umzuwandeln:
Suche:
Ersatz (das ist Backslash, Kleinbuchstabe L, Backslash, eins):
quelle
Ich suchte nach einer Lösung für das gleiche Problem, außer dass ich eine Kette brauchte; z.B
Ausgehend von den netten Zwei-Wort-Lösungen hier habe ich Folgendes gefunden:
Der größte Teil der komplizierten Logik besteht darin, zu vermeiden, dass das erste Wort in Kleinbuchstaben geschrieben wird. Hier ist eine einfachere Version, wenn es Ihnen nichts ausmacht, das erste Wort zu ändern:
Natürlich können Sie die regulären Ausdrücke vorkompilieren oder mit einem Unterstrich anstelle eines Bindestrichs verbinden, wie in den anderen Lösungen beschrieben.
quelle
Prägnant ohne reguläre Ausdrücke, aber HTTPResponseCode => httpresponse_code:
quelle
Ohne Bibliothek:
Ein bisschen schwer, aber
quelle
Sehr schönes RegEx auf dieser Seite vorgeschlagen :
Wenn Python eine String Split-Methode hat, sollte es funktionieren ...
In Java:
quelle
Und wenn wir einen Fall mit bereits nicht getarntem Input abdecken müssen:
quelle
Nur für den Fall, dass jemand eine vollständige Quelldatei transformieren muss, finden Sie hier ein Skript, das dies ausführt.
quelle
Ich hatte ziemlich viel Glück mit diesem:
Dies könnte natürlich für die Geschwindigkeit eines optimiert werden winzige Bit , wenn Sie wollen.
quelle
quelle
Verwenden Sie:,
str.capitalize()
um den ersten Buchstaben der Zeichenfolge (in der Variablen str enthalten) in einen Großbuchstaben umzuwandeln und die gesamte Zeichenfolge zurückzugeben.Beispiel: Befehl: "Hallo" .capitalize () Ausgabe: Hallo
quelle