python ne met en majuscule que la première lettre


179

Je sais que .capitalize () met en majuscule la première lettre d'une chaîne, mais que faire si le premier caractère est un entier?

ce

1bob
5sandy

pour ça

1Bob
5Sandy

Réponses:


234

Si le premier caractère est un entier, il ne mettra pas la première lettre en majuscule.

>>> '2s'.capitalize()
'2s'

Si vous voulez la fonctionnalité, supprimez les chiffres, vous pouvez utiliser '2'.isdigit()pour vérifier chaque caractère.

>>> s = '123sa'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'123Sa'

5
et c'est ce que fait cette réponse, à peu près
njzk2

16
J'utiliserais if c.isalpha () plutôt que sinon c.isdigit ()
njzk2

1
@ Jan-PhilipGehrcke c'est un exercice pour le lecteur. Vous pouvez voir dans ce cas, s n'est jamais vide, il est toujours '123sa': D
Ali Afshar

2
@ Jan-PhilipGehrcke: dans ce cas, le next((i for i,e in enumerate(test) if not e.isdigit()), '0')résout pour la casse de la chaîne vide
njzk2

5
Cette réponse n'est pas correcte. . capitalizetransformera également d'autres caractères en caractères inférieurs. Extrait de la documentation officielle: "Renvoie une version titrée de S, c'est-à-dire que les mots commencent par les caractères de la casse du titre, tous les caractères restants sont en minuscules. "
karantan

246

Seulement parce que personne d'autre ne l'a mentionné:

>>> 'bob'.title()
'Bob'
>>> 'sandy'.title()
'Sandy'
>>> '1bob'.title()
'1Bob'
>>> '1sandy'.title()
'1Sandy'

Cependant, cela donnerait également

>>> '1bob sandy'.title()
'1Bob Sandy'
>>> '1JoeBob'.title()
'1Joebob'

c'est-à-dire qu'il ne met pas seulement en majuscule le premier caractère alphabétique. Mais alors .capitalize()a le même problème, au moins en cela 'joe Bob'.capitalize() == 'Joe bob', alors meh.


38

Ceci est similaire à la réponse de @ Anon en ce sens qu'il garde le reste de la casse de la chaîne intacte, sans avoir besoin du module re.

def sliceindex(x):
    i = 0
    for c in x:
        if c.isalpha():
            i = i + 1
            return i
        i = i + 1

def upperfirst(x):
    i = sliceindex(x)
    return x[:i].upper() + x[i:]

x = '0thisIsCamelCase'

y = upperfirst(x)

print(y)
# 0ThisIsCamelCase

Comme @Xan l'a souligné, la fonction pourrait utiliser plus de vérification des erreurs (comme vérifier que x est une séquence - mais j'omets les cas de bord pour illustrer la technique)

Mis à jour par commentaire @normanius (merci!)

Merci à @GeoStoneMarten d'avoir fait remarquer que je n'ai pas répondu à la question! -fixé ça


2
Très utile, mais nécessite une len(x) == 0branche.
Xan

depuis python 2.5 le cas vide peut toujours être traité sur une seule ligne: return x[0].upper() + x[1:] if len(x) > 0 else x
danio

Réponse très utile, car capitalize& d' titleabord minuscule la chaîne entière, puis majuscule seulement la première lettre.
Jonas Libbrecht

5
Utile. Il suffit de l'utiliser a[:1].upper() + a[1:], cela prendra soin de la len(X)==0valise d'angle.
normanius

1
Bon travail mais ne fonctionne pas dans ce cas car cette fonction ne met en majuscule que le premier caractère et le premier caractère est un chiffre et non du texte. Dans ce cas, vous devez diviser le nombre et le chiffre avant de l'utiliser et de joindre le résultat.
GeoStoneMarten

13

Voici une ligne unique qui mettra en majuscule la première lettre et laissera la casse de toutes les lettres suivantes:

import re

key = 'wordsWithOtherUppercaseLetters'
key = re.sub('([a-zA-Z])', lambda x: x.groups()[0].upper(), key, 1)
print key

Cela entraînera WordsWithOtherUppercaseLetters


4

Comme vu ici répondu par Chen Houwu, il est possible d'utiliser le package string:

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

1

Je suis venu avec ceci:

import re

regex = re.compile("[A-Za-z]") # find a alpha
str = "1st str"
s = regex.search(str).group() # find the first alpha
str = str.replace(s, s.upper(), 1) # replace only 1 instance
print str

1

Vous pouvez remplacer la première lettre ( preceded by a digit) de chaque mot en utilisant regex:

re.sub(r'(\d\w)', lambda w: w.group().upper(), '1bob 5sandy')

output:
 1Bob 5Sandy

1

un monoplace: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))


Je pense que tu veux dire ça, n'est-ce pas? '' .join (sub [: 1] .upper () + sub [1:] for sub in text.split (''))
Michael

Corrigée. Merci @Michael
Gürol Canbek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.