Beispiel:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Gibt es eine Bibliothek oder eine Standardmethode, um diese Aufgabe auszuführen?
Beispiel:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Gibt es eine Bibliothek oder eine Standardmethode, um diese Aufgabe auszuführen?
Antworten:
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'
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:
def camelCase(st):
output = ''.join(x for x in st.title() if x.isalnum())
return output[0].lower() + output[1:]
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.
matchan die Funktion übergeben? und da matchesin regulären Ausdrücken Gruppen haben. Deshalb gibt es diese Linie lambda m:m.group(0).capitalize()?
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.
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())
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).
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
Beachten Sie, dass es fehlschlägt, wenn eine bereits mit Kamel ummantelte Schnur präsentiert wird!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
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!
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.)
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
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d