Come capitalizzare la prima lettera di ogni parola in una stringa?

s = 'the brown fox'

...fare qualcosa qui...

s dovrebbe essere :

'The Brown Fox'

Qual è il modo più semplice per farlo?

Soluzione

Il metodo .title() di una stringa (sia ASCII che Unicode va bene) fa questo:

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

Tuttavia, fate attenzione alle stringhe con apostrofi incorporati, come indicato nella documentazione.

L'algoritmo usa una semplice definizione indipendente dalla lingua di una parola come gruppi di lettere consecutive. La definizione funziona in molti contesti, ma significa che gli apostrofi nelle contrazioni e nei possessivi formano i confini delle parole, il che potrebbe non essere il risultato desiderato:

"sono amici di bill'dal Regno Unito".title() "They'Re Bill'S Friends From The Uk"

Commentari (6)

Solo perché questo genere di cose è divertente per me, ecco altre due soluzioni.

Dividere in parole, siglare ogni parola dai gruppi divisi, e ricongiungersi. Questo cambierà lo spazio bianco che separa le parole in un unico spazio bianco, non importa quale fosse.

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

EDIT: Non ricordo cosa stavo pensando quando ho scritto il codice di cui sopra, ma non c'è bisogno di costruire una lista esplicita; possiamo usare un'espressione generatrice per farlo in modo pigro. Quindi ecco una soluzione migliore:

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

Usare un'espressione regolare per far corrispondere l'inizio della stringa, o lo spazio bianco che separa le parole, più un singolo carattere non spaziale; usare le parentesi per contrassegnare i gruppi di corrispondenza". Scrivete una funzione che prenda un oggetto match, e restituisca il gruppo match degli spazi bianchi invariato e il gruppo match dei caratteri non spaziali in maiuscolo. Poi usate re.sub() per sostituire i pattern. Questa non ha i problemi di punteggiatura della prima soluzione, né rifà lo spazio bianco come la mia prima soluzione. Questa produce il miglior risultato.

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"

Sono contento di aver ricercato questa risposta. Non avevo idea che re.sub() potesse prendere una funzione! Si può fare un'elaborazione non banale all'interno di re.sub() per produrre il risultato finale!

Commentari (5)

Se str.title() non funziona per voi, fate voi stessi la capitalizzazione.

  1. Dividere la stringa in un elenco di parole
  2. Metti in maiuscolo la prima lettera di ogni parola
  3. Unisci le parole in un'unica stringa

Una parola sola:

>>> ' '.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"

Esempio chiaro:

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)
Commentari (1)