s = 'the brown fox'
... hier etwas tun ...
s
sollte sein :
'The Brown Fox'
Was ist der einfachste Weg, dies zu tun?
python
capitalization
capitalize
TIMEX
quelle
quelle
" ".join(w.capitalize() for w in s.split())
"e g 3b"
wäre das gewünschte Ergebnis"E G 3b"
. Gibt jedoch"e g 3b".title()
zurück"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
Die
.title()
Methode kann nicht gut funktionieren,Versuchen Sie
string.capwords()
Methode,Aus den Python-Dokumenten zu Capwords :
quelle
"There once was a string with an 'that had words right after it and then closed'"
. In diesem Beispiel werden alle Welten außer außerthat
wie erwartet großgeschrieben. Die Ergebnisse sind"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
in normalen Situationen. In meiner Situation wirdtitle()
eine schlechte Ausgabe für Namen mit Akzenten oder Dieresis zurückgegeben, währendcapwords()
sie korrekt behandelt wird.Nur weil mir so etwas Spaß macht, gibt es hier zwei weitere Lösungen.
In Wörter aufteilen, jedes Wort aus den aufgeteilten Gruppen mit einem Anfangsbuchstaben versehen und wieder verbinden. Dadurch wird der Leerraum, der die Wörter trennt, in einen einzelnen Leerraum geändert, unabhängig davon, um was es sich handelt.
EDIT: Ich erinnere mich nicht, was ich gedacht habe, als ich den obigen Code geschrieben habe, aber es besteht keine Notwendigkeit, eine explizite Liste zu erstellen. Wir können einen Generatorausdruck verwenden, um dies auf faule Weise zu tun. Also hier ist eine bessere Lösung:
Verwenden Sie einen regulären Ausdruck, der mit dem Anfang der Zeichenfolge übereinstimmt, oder Leerzeichen, die Wörter trennen, sowie ein einzelnes Nicht-Leerzeichen. Verwenden Sie Klammern, um "Übereinstimmungsgruppen" zu markieren. Schreiben Sie eine Funktion, die ein Übereinstimmungsobjekt verwendet und die Übereinstimmungsgruppe für Leerzeichen unverändert und die Übereinstimmungsgruppe für Nicht-Leerzeichen in Großbuchstaben zurückgibt. Verwenden Sie dann
re.sub()
, um die Muster zu ersetzen. Dieser hat weder die Interpunktionsprobleme der ersten Lösung, noch wiederholt er den Leerraum wie meine erste Lösung. Dieser liefert das beste Ergebnis.Ich bin froh, dass ich diese Antwort recherchiert habe. Ich hatte keine Ahnung, dass
re.sub()
das eine Funktion übernehmen könnte! Sie können im Inneren eine nicht triviale Verarbeitung durchführenre.sub()
, um das Endergebnis zu erzielen!quelle
string.capwords
laut der Dokumentation in Chen Houwus Antwort geschieht.Hier ist eine Zusammenfassung der verschiedenen Möglichkeiten, sie funktionieren für alle diese Eingaben:
- Die einfachste Lösung besteht darin, den Satz in Wörter aufzuteilen, den ersten Buchstaben groß zu schreiben und ihn dann wieder zusammenzufügen:
- Wenn Sie die Eingabezeichenfolge nicht zuerst in Wörter aufteilen und ausgefallene Generatoren verwenden möchten:
- Oder ohne itertools zu importieren:
- Oder Sie können reguläre Ausdrücke aus Steveas Antwort verwenden :
Dies sind einige andere Antworten , die veröffentlicht wurden, und Eingaben, für die sie nicht wie erwartet funktionieren, wenn wir die Definition eines Wortes als Satzanfang oder irgendetwas nach einem Leerzeichen verwenden:
Wenn Sie '' für die Aufteilung verwenden, wird die zweite Ausgabe korrigiert, aber capwords () funktioniert für die erste immer noch nicht
Seien Sie vorsichtig mit mehreren Leerzeichen
quelle
lower 123 upper
sollte zurückkehrenlower 123 Upper
, wo dasupper
groß geschrieben wird, da es einer Zahl folgt. Ich weiß, dass dies über den Rahmen der OP-Frage hinausgeht, aber eine nette Ergänzung zu Ihrer bereits ausführlichen Antwort. Danke im Voraus."([0-9]+)(\s+.)"
stattdessen"(^|\s)(\S)"
(eine oder mehrere Zahlen, gefolgt von einem oder mehreren Leerzeichen und einem beliebigen"([0-9]+)(\s*.)"
Zeichen danach ) verwenden oder wenn Sie das Zeichen nach 'null oder mehr' Leerzeichen nach dem Großbuchstaben großschreiben möchten NummerWW1 - the great war
undWW1 - The Great War
stattdessen ausgebenWw1 ...
. Sehen Sie das Problem mit Abkürzungen? Wären Sie bereit, etwas hinzuzufügen, das diesen Fall demonstriert? Ich habe mich schon eine Weile darüber gewundert und kann mir keinen Weg vorstellen, dies zu tun.WW1
alsWW1
Copy-Paste-Ready-Version von @jibberia antwort:
quelle
str.join
akzeptiert Generatoren.join
gen exps akzeptiertstr.join
, wird es im Allgemeinen besonders bevorzugt, ein Listenverständnis zu verwenden. Dies liegt daran, dassjoin
das Argument zweimal durchlaufen wird und es daher schneller ist, eine sofort einsatzbereite Liste als einen Generator bereitzustellen.str.join
das Argument zweimal wiederholt werden müssen? Ich habe nur nachgesehen - das tut es nicht. Bei kleinen Sequenzen ist das Listenverständnis in der Tat schneller.Warum erschweren Sie Ihr Leben mit Joins und for-Loops, wenn die Lösung einfach und sicher ist?
Mach das einfach:
quelle
"the brown fox".capitalize()
?'this is John'
in'This is john'
.string.capitalize()
(im Wesentlichen Echo @luckydonald)Wenn str.title () für Sie nicht funktioniert, führen Sie die Großschreibung selbst durch.
Einzeiler:
Klares Beispiel:
quelle
Wenn Sie nur den ersten Buchstaben wollen:
Aber um jedes Wort groß zu schreiben:
quelle
'hello New York'.capitalize()
ist'Hello new york'
Eine leere Zeichenfolge löst einen Fehler aus, wenn Sie auf [1:] zugreifen. Daher würde ich Folgendes verwenden:
nur den ersten Buchstaben in Großbuchstaben schreiben.
quelle
str.capitalize
?return title[:1].upper() + title[1:]
würde sich auch um dieses Problem kümmern, da das Schneiden der leeren Zeichenfolge auf diese Weise 2 leere Zeichenfolgen ergeben würde, die zusammengefügt werden und eine leere Zeichenfolge ergeben, die zurückgegeben wirdWie Mark betonte, sollten Sie verwenden
.title()
:Wenn Sie jedoch den ersten Buchstaben in einer Django-Vorlage in Großbuchstaben schreiben möchten , können Sie Folgendes verwenden:
oder mit einer Variablen:
quelle
Die vorgeschlagene Methode str.title () funktioniert nicht in allen Fällen. Zum Beispiel:
anstatt
"A B 3c"
.Ich denke, es ist besser, so etwas zu tun:
quelle
Obwohl alle Antworten bereits zufriedenstellend sind, werde ich versuchen, die 2 zusätzlichen Fälle zusammen mit allen vorherigen Fällen abzudecken.
Hier können Sie dies verwenden
das wird dir geben
Ich hoffe das ist nicht überflüssig.
quelle
Wörter groß schreiben ...
@ Gary02127 Kommentar, unten Lösungsarbeitstitel mit Apostroph
quelle
Übersehen Sie nicht die Erhaltung des Leerraums. Wenn Sie verarbeiten möchten
'fred flinstone'
und'Fred Flinstone'
stattdessen erhalten'Fred Flinstone'
, haben Sie Ihren Leerraum beschädigt. Einige der oben genannten Lösungen verlieren Leerraum. Hier ist eine Lösung, die für Python 2 und 3 gut ist und Leerzeichen bewahrt.quelle
Eine schnelle Funktion funktionierte für Python 3
quelle
Großschreibung von Zeichenfolgen mit ungleichmäßigen Leerzeichen
Nun, ich verstehe, dass dies eine alte Frage ist und wahrscheinlich die Antworten fast erschöpft sind, aber ich möchte @Amit Guptas Punkt ungleichmäßiger Räume ergänzen. Von der ursprünglichen Frage möchten wir jedes Wort in der Zeichenfolge groß schreiben
s = 'the brown fox'
. Was wäre, wenn die Zeichenfolges = 'the brown fox'
ungleichmäßige Leerzeichen hätte ?quelle
** Falls Sie verkleinern möchten **
quelle
Diese Antwort gefällt mir sehr gut:
Copy-Paste-Ready-Version von @jibberia antwort:
Aber einige der Zeilen, die ich gesendet habe, haben einige leere Zeichen abgespalten, die beim Versuch, s [1:] auszuführen, Fehler verursacht haben. Es gibt wahrscheinlich einen besseren Weg, dies zu tun, aber ich musste ein if len (s)> 0 hinzufügen, wie in
quelle