Wie konvertiere ich einen String in Python in die Groß- und Kleinschreibung?

91

Beispiel:

HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco

Gibt es eine Bibliothek oder eine Standardmethode, um diese Aufgabe auszuführen?

Tagträumer
quelle
16
Das ist nicht "CamelCase", das ist "Capitalize"; Welches möchtest du haben?
Andrew Marshall
13
camelCase isLike this.
Jonathan M
5
Ihre Beispiele verwenden PascalCase.
David Betz

Antworten:

207

Warum nicht titleRight from the docs verwenden:

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

Wenn Sie PascalCase wirklich wollten, können Sie dies verwenden:

>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
Facundo Casco
quelle
5
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:]
Ivan Chaer
quelle
8
def capitalizeWords(s):
  return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)

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.

Eine längere Version derselben Sache:

WORD_RE = re.compile(r'\w+')

def capitalizeMatch(m):
  return m.group(0).capitalize()

def capitalizeWords(s):
  return WORD_RE.sub(capitalizeMatch, s)

Dadurch wird das Muster vorkompiliert (im Allgemeinen als gute Form angesehen) und anstelle eines Lambdas eine benannte Funktion verwendet.

Laurence Gonsalves
quelle
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:

def FixCase(st):
    return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
mehrere Schnittstellen
quelle
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 is 0 else w.title() for i, w in enumerate(words))

, wenn aufgerufen, würde auf diese Weise führen

camel("San Francisco")  # sanFrancisco
camel("SAN-FRANCISCO")  # sanFrancisco
camel("san_francisco")  # sanFrancisco

weniger einfach

Beachten Sie, dass es fehlschlägt, wenn eine bereits mit Kamel ummantelte Schnur präsentiert wird!

camel("sanFrancisco")   # sanfrancisco  <-- noted limitation

noch weniger einfach

Beachten Sie, dass dies bei vielen Unicode-Zeichenfolgen fehlschlägt

camel("México City")    # mXicoCity     <-- can't handle unicode

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!

Marc
quelle
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.
Marc
4

Mögliche Bibliothek: https://pypi.org/project/stringcase/

Beispiel:

import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"

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.)

Lol
quelle
Oh Ja. War auf der Suche nach einem Paket. Dieses Paket enthält auch Snakecase- und andere Konvertierungsfunktionen.
s2t2
1

Verwenden Sie einfach .title (), und der erste Buchstabe jedes Wortes wird in Großbuchstaben umgewandelt.

>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
Mohammad Shahid Siddiqui
quelle
1

Ich möchte meinen kleinen Beitrag zu diesem Beitrag hinzufügen:

def to_camelcase(str):
  return ' '.join([t.title() for t in str.split()])
Evhz
quelle
Tatsächlich ist str.title () dasselbe und Sie sparen Rechenkosten.
Auros132
1
def camelCase(st):
    s = st.title()
    d = "".join(s.split())
    d = d.replace(d[0],d[0].lower())
    return d
Aishwarya Skandamani
quelle