Question Comment mettre en majuscule la première lettre de chaque mot dans une chaîne (Python)?


s = 'the brown fox'

... fais quelque chose ici ...

s devrait être :

'The Brown Fox'

Quelle est la meilleure façon de faire cela?


420
2017-10-11 02:03


origine


Réponses:


le .title() méthode d'une chaîne (ASCII ou Unicode est bien) fait ceci:

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

Cependant, attention aux chaînes avec des apostrophes incorporées, comme indiqué dans les docs.

L'algorithme utilise une définition simple et indépendante du langage 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"

719
2017-10-11 02:04



le .title() la méthode ne peut pas bien fonctionner,

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

Essayer string.capwords() méthode,

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"

Du docs python sur les mots-clés:

Divisez l'argument en mots en utilisant str.split (), mettez en majuscule chaque mot en utilisant str.capitalize () et joignez les mots en majuscule à l'aide de str.join (). Si le second argument optionnel sep est absent ou None, les caractères d'espacement sont remplacés par un seul espace et les espaces de début et de fin sont supprimés, sinon sep est utilisé pour diviser et joindre les mots.


141
2017-09-09 06:03



Juste parce que ce genre de chose est amusant pour moi, voici deux autres solutions.

Diviser en mots, initialiser chaque mot des groupes divisés, et rejoindre. Cela va changer l'espace blanc séparant les mots en un seul espace blanc, peu importe ce que c'était.

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

EDIT: Je ne me souviens pas de ce que je pensais lorsque j'ai écrit le code ci-dessus, mais il n'y a pas besoin de construire une liste explicite; nous pouvons utiliser une expression de générateur pour le faire paresseusement. Donc, voici une meilleure solution:

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

Utilisez une expression régulière pour faire correspondre le début de la chaîne, ou un espace blanc séparant les mots, plus un caractère non blanc unique; utiliser des parenthèses pour marquer "groupes de correspondance". Écrire une fonction qui prend un objet de correspondance et renvoie le groupe de correspondance de l'espace blanc inchangé et le groupe de correspondance de caractères non-espace en majuscules. Ensuite, utilisez 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.

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"

Je suis content d'avoir recherché cette réponse. Je n'avais aucune idée que re.sub() pourrait prendre une fonction! Vous pouvez effectuer un traitement non trivial à l'intérieur re.sub() pour produire le résultat final!


84
2017-10-11 06:04



Version de copier-coller de @jibberia anwser:

def capitalize(line):
    return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))

13
2018-04-04 14:47



Pourquoi compliquez-vous votre vie avec des jointures et des boucles lorsque la solution est simple et sûre?

Fais juste ceci:

string = "the brown fox"
string[0].upper()+string[1:]

11
2017-08-29 10:13



Si str.title () ne fonctionne pas pour vous, faites la majuscule vous-même.

  1. Séparer la chaîne en une liste de mots
  2. Capitaliser la première lettre de chaque mot
  3. Joindre les mots dans une seule chaîne

Bon mot:

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

Exemple clair:

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)

10
2017-10-11 06:05



Voici un résumé des différentes façons de le faire:

La solution la plus simple est de diviser la phrase en mots et de capitaliser la première lettre puis de la joindre ensemble.

# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error, 
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
  return ' '.join(w[:1].upper() + w[1:] for w in s.split(' ')) 

Si vous ne voulez pas diviser la chaîne d'entrée en mots d'abord, et en utilisant des générateurs de fantaisie:

# Iterate through each of the characters in the string and capitalize 
# the first char and any char after a blank space
from itertools import chain 
def cap_sentence(s):
  return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )

ou sans importer des outils

def cap_sentence(s):
  return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )

ou vous pouvez utiliser des expressions régulières, à partir de La réponse de steveha 

# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
  return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)

Ceux-ci fonctionneront pour toutes ces entrées:

""           => ""       
"a b c"      => "A B C"             
"foO baR"    => "FoO BaR"      
"foo    bar" => "Foo    Bar"   
"foo's bar"  => "Foo's Bar"    
"foo's1bar"  => "Foo's1bar"    
"foo 1bar"   => "Foo 1bar"     

Maintenant, ce sont quelques-uns d'autres réponses qui ont été publiés, et les entrées pour lesquelles ils ne fonctionnent pas comme prévu si nous utilisons la définition d'un mot étant le début de la phrase ou quelque chose après un espace vide:

  return s.title()

# Undesired outputs: 
"foO baR"    => "Foo Bar"       
"foo's bar"  => "Foo'S Bar" 
"foo's1bar"  => "Foo'S1Bar"     
"foo 1bar"   => "Foo 1Bar"      

  return ' '.join(w.capitalize() for w in s.split())    
  # or
  import string
  return string.capwords(s)

# Undesired outputs:
"foO baR"    => "Foo Bar"      
"foo    bar" => "Foo Bar"      

using '' pour le split corrigera la seconde sortie, mais capwords () ne fonctionnera toujours pas pour le premier

  return ' '.join(w.capitalize() for w in s.split(' '))    
  # or
  import string
  return string.capwords(s, ' ')

# Undesired outputs:
"foO baR"    => "Foo Bar"      

Soyez prudent avec plusieurs espaces vides

  return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo    bar" => "Foo Bar"                 

10
2018-02-28 05:29



Une chaîne vide déclenchera une erreur si vous accédez à [1:], donc j'utiliserais:

def my_uppercase(title):
    if not title:
       return ''
    return title[0].upper() + title[1:]

majuscule la première lettre seulement.


5
2018-05-17 12:54



Comme Mark l'a souligné, vous devriez utiliser .title():

"MyAwesomeString".title()

Cependant, si voudrais faire la première lettre majuscule à l'intérieur d'un modèle de django, vous pouvez utiliser ceci:

{{ "MyAwesomeString"|title }}

ou en utilisant une variable:

{{ myvar|title }}

2
2018-03-16 13:04



La méthode proposée str.title () ne fonctionne pas dans tous les cas. Par exemple:

string = "a b 3c"
string.title()
> "A B 3C"

au lieu de "A B 3c".

Je pense qu'il est préférable de faire quelque chose comme ceci:

def capitalize_words(string):
    words = string.split()
    return ' '.join([word.capitalize() for word in words])

capitalize_words(string)
>'A B 3c'

2
2017-11-11 17:57