s = 'the brown fox'
... fais quelque chose ici ...
s
devrait être :
'The Brown Fox'
Quelle est la façon la plus simple de procéder?
s = 'the brown fox'
... fais quelque chose ici ...
s
devrait être :
'The Brown Fox'
Quelle est la façon la plus simple de procéder?
La .title()
méthode d'une chaîne (ASCII ou Unicode est très bien) fait ceci:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Cependant, recherchez les chaînes avec des apostrophes intégrées, comme indiqué dans la documentation.
L'algorithme utilise une définition simple indépendante de la langue d'un mot en tant que groupes de lettres consécutives. La définition fonctionne dans de nombreux contextes, mais cela signifie que les apostrophes dans les contractions et les possessifs forment des limites de mots, ce qui peut ne pas être le résultat souhaité:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
" ".join(w.capitalize() for w in s.split())
"e g 3b"
, le résultat souhaité serait"E G 3b"
. Cependant,"e g 3b".title()
revient"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
La
.title()
méthode ne fonctionne pas bien,Essayez la
string.capwords()
méthode,Depuis les documents python sur capwords :
la source
"There once was a string with an 'that had words right after it and then closed'"
. Avec cet exemple, tous les mondes à l'exception dethat
sont capitalisés comme prévu. Les résultats étant"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
dans des situations normales. Dans ma situation,title()
retourne une mauvaise sortie pour les noms avec des accents ou une diérèse, tout en lecapwords()
gérant correctement.Juste parce que ce genre de chose est amusant pour moi, voici deux autres solutions.
Divisez en mots, initialisez chaque mot des groupes divisés et rejoignez. Cela changera l'espace blanc séparant les mots en un seul espace blanc, quel qu'il soit.
EDIT: Je ne me souviens pas de ce à quoi je pensais quand j'ai écrit le code ci-dessus, mais il n'est pas nécessaire de construire une liste explicite; nous pouvons utiliser une expression de générateur pour le faire de façon paresseuse. Voici donc une meilleure solution:
Utilisez une expression régulière pour faire correspondre le début de la chaîne, ou des mots séparant les espaces blancs, plus un seul caractère non blanc; utilisez des parenthèses pour marquer les "groupes de correspondance". Écrivez une fonction qui prend un objet de correspondance et renvoie le groupe de correspondance des espaces blancs inchangé et le groupe de correspondance des caractères non blancs en majuscules. Utilisez ensuite
re.sub()
pour remplacer les motifs. Celui-ci n'a pas les problèmes de ponctuation de la première solution, ni ne refait l'espace blanc comme ma première solution. Celui-ci produit le meilleur résultat.Je suis content d'avoir fait des recherches sur cette réponse. Je n'avais aucune idée que cela
re.sub()
pourrait prendre une fonction! Vous pouvez faire un traitement non trivial à l'intérieurre.sub()
pour produire le résultat final!la source
string.capwords
cas, selon la documentation dans la réponse de Chen Houwu.Voici un résumé des différentes façons de le faire, elles fonctionneront pour toutes ces entrées:
- La solution la plus simple consiste à diviser la phrase en mots et à mettre la première lettre en majuscule, puis à la recoller:
- Si vous ne voulez pas d'abord diviser la chaîne d'entrée en mots et utiliser des générateurs de fantaisie:
- Ou sans importer d'itertools:
- Ou vous pouvez utiliser des expressions régulières, de la réponse de steveha :
Maintenant, voici quelques autres réponses qui ont été publiées et des entrées pour lesquelles elles ne fonctionnent pas comme prévu si nous utilisons la définition d'un mot comme début de phrase ou quoi que ce soit après un espace vide:
l'utilisation de '' pour la division fixera la deuxième sortie, mais capwords () ne fonctionnera toujours pas pour la première
Soyez prudent avec plusieurs espaces vides
la source
lower 123 upper
devrait revenirlower 123 Upper
, où leupper
est en majuscule comme il suit un nombre. Je sais que cela dépasse la portée de la question du PO, mais c'est un complément intéressant à votre réponse déjà détaillée. Merci d'avance."([0-9]+)(\s+.)"
place de"(^|\s)(\S)"
(faire correspondre un ou plusieurs nombres, suivi d'un ou plusieurs espaces, et n'importe quel caractère après), ou"([0-9]+)(\s*.)"
si vous voulez mettre en majuscule le caractère après 'zéro ou plusieurs' espaces après le numberWW1 - the great war
et la sortieWW1 - The Great War
au lieu deWw1 ...
. Voir le problème avec les abréviations? Seriez-vous prêt à ajouter quelque chose qui illustre ce cas? Je me pose des questions à ce sujet depuis un certain temps maintenant et je ne vois pas comment le faire.WW1
sortiraient commeWW1
Version prête à copier-coller de @jibberia anwser:
la source
str.join
accepte les générateurs.join
accepte les exps gen, dans le casstr.join
particulier, il est généralement préférable d'utiliser une compréhension de liste. En effet, iljoin
répète deux fois l'argument et il est donc plus rapide de fournir une liste prête à l'emploi plutôt qu'un générateur.str.join
besoin de répéter deux fois l'argument? Je viens de vérifier - ce n'est pas le cas. Cependant, pour les petites séquences, la compréhension de la liste est en fait plus rapide.Pourquoi compliquez-vous votre vie avec des jointures et des boucles alors que la solution est simple et sûre ??
Faites juste ceci:
la source
"the brown fox".capitalize()
?'this is John'
devenir'This is john'
.string.capitalize()
(en écho essentiellement à @luckydonald)Si str.title () ne fonctionne pas pour vous, faites la capitalisation vous-même.
Bon mot:
Exemple clair:
la source
Si seulement vous voulez la première lettre:
Mais pour capitaliser chaque mot:
la source
'hello New York'.capitalize()
est'Hello new york'
Une chaîne vide soulèvera une erreur si vous accédez à [1:], donc j'utiliserais:
pour mettre en majuscule uniquement la première lettre.
la source
str.capitalize
?return title[:1].upper() + title[1:]
s'occuperait également de ce problème puisque trancher la chaîne vide comme cela donnerait 2 chaînes vides, réunies pour créer une chaîne vide qui est retournéeComme Mark l'a souligné, vous devez utiliser
.title()
:Cependant, si vous souhaitez mettre la première lettre en majuscule dans un modèle django , vous pouvez utiliser ceci:
ou en utilisant une variable:
la source
La méthode suggérée str.title () ne fonctionne pas dans tous les cas. Par exemple:
au lieu de
"A B 3c"
.Je pense qu'il vaut mieux faire quelque chose comme ça:
la source
Bien que toutes les réponses soient déjà satisfaisantes, je vais essayer de couvrir les 2 cas supplémentaires ainsi que tous les cas précédents.
Ici, vous pouvez utiliser ceci
cela vous donnera
J'espère que ce n'est pas redondant.
la source
Pour mettre des mots en majuscules ...
@ Commentaire de Gary02127, sous le titre de travail de la solution avec apostrophe
la source
Ne négligez pas la préservation de l'espace blanc. Si vous voulez traiter
'fred flinstone'
et que vous obtenez'Fred Flinstone'
au lieu de'Fred Flinstone'
, vous avez corrompu votre espace blanc. Certaines des solutions ci-dessus perdront de l'espace blanc. Voici une solution qui convient à Python 2 et 3 et qui préserve l'espace blanc.la source
Une fonction rapide a fonctionné pour Python 3
la source
Capitaliser la chaîne avec des espaces non uniformes
Eh bien, je comprends que c'est une vieille question et les réponses ont probablement presque été épuisées, mais je voudrais ajouter au point @Amit Gupta des espaces non uniformes. À partir de la question d'origine, nous aimerions mettre en majuscule chaque mot de la chaîne
s = 'the brown fox'
. Et si la chaîne étaits = 'the brown fox'
avec des espaces non uniformes.la source
** Si vous souhaitez réduire la taille **
la source
J'aime vraiment cette réponse:
Version prête à copier-coller de @jibberia anwser:
Mais certaines des lignes que j'envoyais séparaient des caractères vierges '' qui provoquaient des erreurs lors de la tentative de s [1:]. Il y a probablement une meilleure façon de le faire, mais j'ai dû ajouter un si len (s)> 0, comme dans
la source