Ich denke, das 'r' in "Sie sind" sollte in Kleinbuchstaben geschrieben werden. Und das 's' in "Bill's" muss definitiv Kleinbuchstaben sein.
Daniel Fischer
3
@ Daniel - Dieses Problem wird in den Dokumenten für Folgendes erwähnt title: "Der Algorithmus verwendet eine einfache sprachunabhängige Definition eines Wortes als Gruppen aufeinanderfolgender Buchstaben. Die Definition funktioniert in vielen Kontexten, bedeutet jedoch, dass Apostrophe in Kontraktionen und Possessiven Wortgrenzen bilden. was möglicherweise nicht das gewünschte Ergebnis ist ". Eine mögliche Lösung wäre, Laurences Antwort mit dem regulären Ausdruck zu verwenden, r"['\w]+"damit Apostrophe ein Match nicht beenden (zusätzliche Interpunktion könnte nach Bedarf hinzugefügt werden).
Andrew Clark
18
Für die Aufzeichnung ist eine bessere Möglichkeit, das letzte CamelCase-Beispiel auszuführen, wie folgt 'make IT camel CaSe'.title().replace(' ', '').
Henry Gomersall
15
Wenn jemand das Gefühl hat, verrückte Pillen zu nehmen, dann ist dies PascalCase, nicht camelCase.
Rob
4
Netter Code, aber camelCase beginnt nicht mit einem GROSSBUCHSTABEN. Versuchen Sie dies: def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] Verwendung:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Ron Kalian
21
Dieser würde immer mit Kleinbuchstaben beginnen und auch nicht alphanumerische Zeichen entfernen:
def camelCase(st):
output =''.join(x for x in st.title()if x.isalnum())return output[0].lower()+ output[1:]
re.subkann eine Funktion für den "Ersatz" übernehmen (und nicht nur eine Zeichenfolge, mit der die meisten Leute vertraut zu sein scheinen). Diese Repl-Funktion wird mit einem re.MatchObjekt für jede Übereinstimmung des Musters aufgerufen , und das Ergebnis (das eine Zeichenfolge sein sollte) wird als Ersatz für diese Übereinstimmung verwendet.
Dieser ist ziemlich ordentlich, ich versuche, mich mit Lambda-Funktionen zu beschäftigen. Vielen Dank für Ihre Hilfe
Tagträumer
1
@ JohnMachin Ich habe nur gefragt, weil ich dachte, das Hinzufügen einer Erklärung würde Ihre Antwort vollständiger und besser machen.
NN
@Laurence Gonsalves was macht Lambda hier?
Zion
Was macht Lambda hier? von was ich entziffern kann und von dir erklärung. das habe ich verstanden Wenn Sie eine Funktion in re verwenden, wird jede matchan die Funktion übergeben? und da matchesin regulären Ausdrücken Gruppen haben. Deshalb gibt es diese Linie lambda m:m.group(0).capitalize()?
Zion
@ Zion ja. Wenn re.subeine aufrufbare (z. B. eine Funktion) als "Ersetzung" angegeben wird, übergibt sie das Übereinstimmungsobjekt an diese aufrufbare und erwartet, dass eine Zeichenfolge zurückgegeben wird, die tatsächlich als Ersetzung verwendet wird. Wenn Sie Lambdas verwirrend finden, macht die "längere Version" genau das Gleiche ausführlicher.
Laurence Gonsalves
5
Warum nicht eins schreiben? So etwas kann Ihre Anforderungen erfüllen:
defFixCase(st):return' '.join(''.join([w[0].upper(), w[1:].lower()])for w in st.split())
danke, das hat komplett geholfen. Mein schlechtes, ich dachte nicht daran, einen an erster Stelle zu schreiben
Tagträumer
5
Hinweis: Warum gebe ich noch eine Antwort? Diese Antwort basiert auf dem Titel der Frage und der Vorstellung, dass Camelcase definiert ist als: eine Reihe von Wörtern, die verkettet wurden (keine Leerzeichen!), So dass jedes der ursprünglichen Wörter mit einem Großbuchstaben beginnt (der Rest ist Kleinbuchstaben). mit Ausnahme des ersten Wortes der Reihe (das vollständig in Kleinbuchstaben geschrieben ist). Es wird auch angenommen, dass "alle Zeichenfolgen" sich auf den ASCII-Zeichensatz beziehen; Unicode würde mit dieser Lösung nicht funktionieren).
einfach
In Anbetracht der obigen Definition ist diese Funktion
import re
word_regex_pattern = re.compile("[^A-Za-z]+")def camel(chars):
words = word_regex_pattern.split(chars)return"".join(w.lower()if i is0else w.title()for i, w in enumerate(words))
Ich habe keine Lösung für diese Fälle (oder andere, die mit etwas Kreativität eingeführt werden könnten). Also, wie bei allen Dingen, die mit Strings zu tun haben, decken Sie Ihre eigenen Randfälle ab und viel Glück mit Unicode!
Wie können Sie feststellen, dass es sich bei einer Zeichenfolge um einen Camel-Fall handelt, ohne die Bedeutung des Satzes zu kennen? In Ihrem "weniger einfachen" Beispiel ist "sanfRancisco" der Fall Camel sowie "itSnotcaMelcAse".
Patrice Bernassola
Ich vermute, Ihre Eingabe hatte Apostraphen oder andere Interpunktion? Ich sollte andere fehlgeschlagene Eingaben beachten. Auf jeden Fall ein guter Fang. Welche Eingabe haben Sie gemacht?
Marc
1
Ich meine, als eine Folge von Zeichen ohne Leerzeichen muss als 1 Wort betrachtet werden. Sie können keine Arbeit daraus extrahieren, ohne die Bedeutung des Satzes zu kennen. Geben Sie "sanfRancisco" oder "itSnotcaMelcAse" als Eingabe von camello () ein und Sie werden sehen, dass die Ausgabe dieselbe ist.
Patrice Bernassola
Oh, ich verstehe - ja, ich denke du hast recht. Ich passe die Lösung an. Ich werde es aktualisieren.
Es ist zwar fraglich, ob Leerzeichen darin verbleiben. (Beispiele zeigen, dass Leerzeichen entfernt werden, aber es gibt ein Bug-Tracker-Problem, bei dem festgestellt wird, dass Leerzeichen darin verbleiben.)
Antworten:
Warum nicht
title
Right from the docs verwenden:Wenn Sie PascalCase wirklich wollten, können Sie dies verwenden:
quelle
title
: "Der Algorithmus verwendet eine einfache sprachunabhängige Definition eines Wortes als Gruppen aufeinanderfolgender Buchstaben. Die Definition funktioniert in vielen Kontexten, bedeutet jedoch, dass Apostrophe in Kontraktionen und Possessiven Wortgrenzen bilden. was möglicherweise nicht das gewünschte Ergebnis ist ". Eine mögliche Lösung wäre, Laurences Antwort mit dem regulären Ausdruck zu verwenden,r"['\w]+"
damit Apostrophe ein Match nicht beenden (zusätzliche Interpunktion könnte nach Bedarf hinzugefügt werden).'make IT camel CaSe'.title().replace(' ', '')
.def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:]
Verwendung:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Dieser würde immer mit Kleinbuchstaben beginnen und auch nicht alphanumerische Zeichen entfernen:
quelle
re.sub
kann eine Funktion für den "Ersatz" übernehmen (und nicht nur eine Zeichenfolge, mit der die meisten Leute vertraut zu sein scheinen). Diese Repl-Funktion wird mit einemre.Match
Objekt für jede Übereinstimmung des Musters aufgerufen , und das Ergebnis (das eine Zeichenfolge sein sollte) wird als Ersatz für diese Übereinstimmung verwendet.Eine längere Version derselben Sache:
Dadurch wird das Muster vorkompiliert (im Allgemeinen als gute Form angesehen) und anstelle eines Lambdas eine benannte Funktion verwendet.
quelle
match
an die Funktion übergeben? und damatches
in regulären Ausdrücken Gruppen haben. Deshalb gibt es diese Linielambda m:m.group(0).capitalize()
?re.sub
eine aufrufbare (z. B. eine Funktion) als "Ersetzung" angegeben wird, übergibt sie das Übereinstimmungsobjekt an diese aufrufbare und erwartet, dass eine Zeichenfolge zurückgegeben wird, die tatsächlich als Ersetzung verwendet wird. Wenn Sie Lambdas verwirrend finden, macht die "längere Version" genau das Gleiche ausführlicher.Warum nicht eins schreiben? So etwas kann Ihre Anforderungen erfüllen:
quelle
Hinweis: Warum gebe ich noch eine Antwort? Diese Antwort basiert auf dem Titel der Frage und der Vorstellung, dass Camelcase definiert ist als: eine Reihe von Wörtern, die verkettet wurden (keine Leerzeichen!), So dass jedes der ursprünglichen Wörter mit einem Großbuchstaben beginnt (der Rest ist Kleinbuchstaben). mit Ausnahme des ersten Wortes der Reihe (das vollständig in Kleinbuchstaben geschrieben ist). Es wird auch angenommen, dass "alle Zeichenfolgen" sich auf den ASCII-Zeichensatz beziehen; Unicode würde mit dieser Lösung nicht funktionieren).
einfach
In Anbetracht der obigen Definition ist diese Funktion
, wenn aufgerufen, würde auf diese Weise führen
weniger einfach
Beachten Sie, dass es fehlschlägt, wenn eine bereits mit Kamel ummantelte Schnur präsentiert wird!
noch weniger einfach
Beachten Sie, dass dies bei vielen Unicode-Zeichenfolgen fehlschlägt
Ich habe keine Lösung für diese Fälle (oder andere, die mit etwas Kreativität eingeführt werden könnten). Also, wie bei allen Dingen, die mit Strings zu tun haben, decken Sie Ihre eigenen Randfälle ab und viel Glück mit Unicode!
quelle
Mögliche Bibliothek: https://pypi.org/project/stringcase/
Beispiel:
Es ist zwar fraglich, ob Leerzeichen darin verbleiben. (Beispiele zeigen, dass Leerzeichen entfernt werden, aber es gibt ein Bug-Tracker-Problem, bei dem festgestellt wird, dass Leerzeichen darin verbleiben.)
quelle
Verwenden Sie einfach .title (), und der erste Buchstabe jedes Wortes wird in Großbuchstaben umgewandelt.
quelle
Ich möchte meinen kleinen Beitrag zu diesem Beitrag hinzufügen:
quelle
quelle