Wie wird der erste Buchstabe jedes Wortes in einer Zeichenkette großgeschrieben?

s = 'the brown fox'

...hier etwas tun...

s sollte sein :

'The Brown Fox'

Wie kann man das am einfachsten machen?

Lösung

Die Methode .title() einer Zeichenkette (entweder ASCII oder Unicode ist in Ordnung) tut dies:

>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'

Achten Sie jedoch auf Strings mit eingebetteten Apostrophen, wie in der Dokumentation beschrieben.

Der Algorithmus verwendet eine einfache, sprachunabhängige Definition eines Wortes als Gruppe von aufeinanderfolgenden Buchstaben. Diese Definition funktioniert in vielen Kontexten, aber sie bedeutet, dass Apostrophe in Zusammenziehungen und Possessiven Wortgrenzen bilden, was nicht unbedingt das gewünschte Ergebnis ist:

"sie'sind Bill's Freunde aus dem Vereinigten Königreich".title()

"They'Re Bill'S Friends From The Uk"

Kommentare (6)

Und weil mir so etwas Spaß macht, hier noch zwei weitere Lösungen.

In Wörter aufteilen, jedes Wort aus den getrennten Gruppen mit den Initialen versehen und wieder zusammenfügen. Dadurch wird der Leerraum zwischen den Wörtern in einen einzigen Leerraum umgewandelt, unabhängig davon, was er war.

s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)

EDIT: Ich weiß nicht mehr, was ich dachte, als ich den obigen Code geschrieben habe, aber es ist nicht nötig, eine explizite Liste zu erstellen; wir können einen Generatorausdruck verwenden, um dies auf faule Weise zu tun. Hier ist also eine bessere Lösung:

s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())

Verwenden Sie einen regulären Ausdruck, um den Anfang der Zeichenkette oder das Leerzeichen zwischen den Wörtern sowie ein einzelnes Zeichen ohne Leerzeichen abzugleichen; verwenden Sie Klammern, um "Übereinstimmungsgruppen" zu markieren. Schreiben Sie eine Funktion, die ein Match-Objekt entgegennimmt und die Übereinstimmungsgruppe mit Leerzeichen unverändert und die Übereinstimmungsgruppe mit Nicht-Leerzeichen in Großbuchstaben zurückgibt. Verwenden Sie dann re.sub(), um die Muster zu ersetzen. Bei dieser Lösung gibt es weder die Interpunktionsprobleme der ersten Lösung, noch wird das Leerzeichen wiederhergestellt wie bei meiner ersten Lösung. Diese Lösung liefert das beste Ergebnis.

import re
s = 'the brown fox'

def repl_func(m):
    """process regular expression match groups for word upper-casing problem"""
    return m.group(1) + m.group(2).upper()

s = re.sub("(^|\s)(\S)", repl_func, s)

>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"

Ich bin froh, dass ich diese Antwort recherchiert habe. Ich hatte keine Ahnung, dass re.sub() eine Funktion annehmen kann! Man kann innerhalb von re.sub() eine nicht-triviale Verarbeitung durchführen, um das Endergebnis zu erhalten!

Kommentare (5)

Wenn str.title() bei Ihnen nicht funktioniert, können Sie die Großschreibung selbst vornehmen.

  1. Zerlegen Sie die Zeichenkette in eine Liste von Wörtern
  2. Schreiben Sie den ersten Buchstaben eines jeden Wortes groß
  3. Verbinden Sie die Wörter zu einer einzigen Zeichenfolge

Einzeiler:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

Klares Beispiel:

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)
Kommentare (1)