s = 'the brown fox'
... faça alguma coisa aqui ...
s
deveria estar :
'The Brown Fox'
Qual é a maneira mais fácil de fazer isso?
python
capitalization
capitalize
TIMEX
fonte
fonte
" ".join(w.capitalize() for w in s.split())
"e g 3b"
, o resultado desejado seria"E G 3b"
. No entanto,"e g 3b".title()
retorna"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
O
.title()
método não pode funcionar bem,Tente
string.capwords()
método,Nos documentos python sobre capwords :
fonte
"There once was a string with an 'that had words right after it and then closed'"
. Neste exemplo, todos os mundos, exceto os,that
são capitalizados conforme o esperado. Os resultados são #"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
em situações normais. Na minha situação,title()
retorna uma saída incorreta para nomes com acentos ou dieresis, enquantocapwords()
manipulada corretamente.Só porque esse tipo de coisa é divertido para mim, aqui estão mais duas soluções.
Divida em palavras, limpe cada palavra dos grupos de divisão e junte-se novamente. Isso mudará o espaço em branco que separa as palavras em um único espaço em branco, não importa o que fosse.
EDIT: Não me lembro do que estava pensando quando escrevi o código acima, mas não há necessidade de criar uma lista explícita; podemos usar uma expressão geradora para fazê-lo de forma preguiçosa. Então, aqui está uma solução melhor:
Use uma expressão regular para corresponder ao início da sequência, ou espaço em branco que separa as palavras, além de um caractere que não seja um espaço em branco; use parênteses para marcar "grupos de correspondência". Escreva uma função que pegue um objeto de correspondência e retorne o grupo de correspondência de espaços em branco inalterado e o grupo de correspondência de caracteres que não sejam espaços em branco em maiúsculas. Em seguida, use
re.sub()
para substituir os padrões. Este não possui os problemas de pontuação da primeira solução, nem refaz o espaço em branco como minha primeira solução. Este produz o melhor resultado.Estou feliz por ter pesquisado esta resposta. Eu não tinha ideia de que
re.sub()
poderia ter uma função! Você pode fazer um processamento não trivial dentrore.sub()
para produzir o resultado final!fonte
string.capwords
acontece, de acordo com a documentação na resposta de Chen Houwu.Aqui está um resumo das diferentes maneiras de fazer isso, elas funcionarão para todas essas entradas:
- A solução mais simples é dividir a frase em palavras e colocar em maiúscula a primeira letra e depois juntá-la novamente:
- Se você não deseja dividir a sequência de entrada em palavras primeiro, e usando geradores sofisticados:
- Ou sem importar ferramentas:
- Ou você pode usar expressões regulares, a partir da resposta de steveha :
Agora, estas são algumas outras respostas que foram postadas e entradas para as quais elas não funcionam conforme o esperado, se estivermos usando a definição de uma palavra que é o início da frase ou qualquer coisa depois de um espaço em branco:
usar '' para a divisão corrigirá a segunda saída, mas capwords () ainda não funcionará pela primeira
Tenha cuidado com vários espaços em branco
fonte
lower 123 upper
deve retornarlower 123 Upper
, onde oupper
é capitalizado como segue um número. Sei que vai além do escopo da pergunta do OP, mas é um bom complemento para a sua já extensa resposta. Desde já, obrigado."([0-9]+)(\s+.)"
vez de"(^|\s)(\S)"
(corresponder a um ou mais números, seguidos de um ou mais espaços e qualquer caractere depois), ou"([0-9]+)(\s*.)"
se você quiser colocar o caractere em maiúscula após 'zero ou mais' espaços após o númeroWW1 - the great war
e output emWW1 - The Great War
vez deWw1 ...
. Veja o problema com abreviações? Você gostaria de adicionar algo que demonstre esse caso? Eu estive pensando sobre isso por um tempo agora e não consigo pensar em uma maneira de fazê-lo.WW1
seriamWW1
Versão pronta para copiar e colar do @jibberia anwser:
fonte
str.join
aceita geradores.join
aceita gen exps, no caso destr.join
particularmente, geralmente é preferível usar uma lista de compreensão. Isso ocorre porquejoin
itera duas vezes sobre o argumento e, portanto, é mais rápido fornecer uma lista pronta para uso em vez de um gerador.str.join
precisaria repetir duas vezes sobre o argumento? Acabei de verificar - não. Embora para pequenas sequências a compreensão da lista seja mais rápida.Por que você complica sua vida com junções e loops quando a solução é simples e segura?
Apenas faça o seguinte:
fonte
"the brown fox".capitalize()
?'this is John'
em'This is john'
.string.capitalize()
(@luckydonald essencialmente ecoando)Se str.title () não funcionar, faça você mesmo a capitalização.
Uma linha:
Exemplo claro:
fonte
Se você quiser apenas a primeira letra:
Mas para capitalizar cada palavra:
fonte
'hello New York'.capitalize()
é'Hello new york'
Uma string vazia gerará um erro se você acessar [1:]; portanto, eu usaria:
para maiúsculas apenas a primeira letra.
fonte
str.capitalize
é para isso que serve?return title[:1].upper() + title[1:]
também cuidar desse problema, já que cortar a cadeia vazia como o que daria 2 cadeias vazias, unidas fazer uma cadeia vazia, que é devolvidoComo Mark apontou, você deve usar
.title()
:No entanto, se você quiser colocar a primeira letra em maiúscula dentro de um modelo de django , você pode usar o seguinte:
ou usando uma variável:
fonte
O método sugerido str.title () não funciona em todos os casos. Por exemplo:
em vez de
"A B 3c"
.Eu acho que é melhor fazer algo assim:
fonte
Embora todas as respostas já sejam satisfatórias, tentarei cobrir os dois casos extras, juntamente com o caso anterior.
Aqui você pode usar isso
isso vai te dar
Espero que isso não seja redundante.
fonte
Para capitalizar palavras ...
@ Gary02127 comentário, abaixo do título do trabalho da solução com apóstrofo
fonte
Não negligencie a preservação do espaço em branco. Se você deseja processar
'fred flinstone'
e obtém, em'Fred Flinstone'
vez de'Fred Flinstone'
, danificou seu espaço em branco. Algumas das soluções acima perderão espaço em branco. Aqui está uma solução que é boa para Python 2 e 3 e preserva o espaço em branco.fonte
Uma função rápida funcionou para Python 3
fonte
Colocar letras maiúsculas em maiúsculas com espaços não uniformes
Bem, eu entendo que essa é uma pergunta antiga e provavelmente as respostas podem estar quase esgotadas, mas eu gostaria de acrescentar ao ponto de espaços não uniformes do @Amit Gupta. A partir da pergunta original, gostaríamos de capitalizar todas as palavras da string
s = 'the brown fox'
. E se a string estivesses = 'the brown fox'
com espaços não uniformes.fonte
** Caso você queira reduzir o tamanho **
fonte
Eu realmente gosto desta resposta:
Versão pronta para copiar e colar do @jibberia anwser:
Mas algumas das linhas que eu estava enviando separavam alguns caracteres em branco '' que causavam erros ao tentar fazer s [1:]. Provavelmente existe uma maneira melhor de fazer isso, mas eu tive que adicionar um if len (s)> 0, como em
fonte