Como capitalizar a primeira letra de cada palavra em um fio?

s = 'the brown fox'

...fazer algo aqui...

deve ser :

'The Brown Fox'

Qual'é a maneira mais fácil de fazer isto?

Solução

O método .title() de uma string (ou ASCII ou Unicode é bom) faz isso:

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

No entanto, cuidado com as cordas com apóstrofos embutidos, como observado nos documentos.

O algoritmo usa uma definição simples e independente do idioma de uma palavra como grupos de letras consecutivas. A definição funciona em muitos contextos, mas significa que os apóstrofos em contrações e possessivos formam limites de palavras, o que pode não ser o resultado desejado:

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

Comentários (6)

Só porque este tipo de coisas é divertido para mim, aqui estão mais duas soluções.

Dividam-se em palavras, separem cada palavra dos grupos divididos e juntem-se novamente. Isto vai mudar o espaço branco que separa as palavras em um único espaço branco, não importa o que fosse.

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

EDIT: Eu não'não me lembro o que eu estava pensando quando escrevi o código acima, mas não há necessidade de construir uma lista explícita; podemos usar uma expressão geradora para fazer isso de forma preguiçosa. Portanto, aqui está uma solução melhor:

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

Use uma expressão regular para combinar com o início da string, ou espaço em branco separando palavras, mais um único caractere não espacial; use parênteses para marcar " combine grupos". Escreva uma função que pegue um objeto de correspondência e retorne o grupo de correspondência de espaço em branco inalterado e o grupo de correspondência de caracteres sem espaço em branco em maiúsculas. Depois utilize re.sub() para substituir os padrões. Este não tem os problemas de pontuação da primeira solução, nem refaz o espaço em branco como a minha primeira solução. Esta produz o melhor resultado.

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"

I' estou contente por ter pesquisado esta resposta. Eu não tinha idéia de que re.sub() poderia ter uma função! Você pode fazer processamento não trivial dentro de re.sub() para produzir o resultado final!

Comentários (5)

Se str.title() não't funcionar para você, faça a capitalização você mesmo.

  1. Dividir a seqüência em uma lista de palavras
    1. Capitalizar a primeira letra de cada palavra
  2. Junte as palavras em uma única cadeia

Um-liner:

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

Exemplo claro:

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)
Comentários (1)