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
user1442957
la source

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'
Ali Afshar
la source
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.

DSM
la source
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

Pinkwerks
la source
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

Anon
la source
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"
Fábio
la source
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
Prasanthe
la source
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
Kenly
la source
1

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

Gürol Canbek
la source
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