Estou ciente .capitalize () coloca em maiúscula a primeira letra de uma seqüência de caracteres, mas e se o primeiro caractere for um número inteiro?
isto
1bob
5sandy
para isso
1Bob
5Sandy
Estou ciente .capitalize () coloca em maiúscula a primeira letra de uma seqüência de caracteres, mas e se o primeiro caractere for um número inteiro?
isto
1bob
5sandy
para isso
1Bob
5Sandy
Respostas:
Se o primeiro caractere for um número inteiro, ele não maiúscula a primeira letra.
>>> '2s'.capitalize()
'2s'
Se você deseja a funcionalidade, retire os dígitos, você pode usar '2'.isdigit()
para verificar cada caractere.
>>> s = '123sa'
>>> for i, c in enumerate(s):
... if not c.isdigit():
... break
...
>>> s[:i] + s[i:].capitalize()
'123Sa'
next((i for i,e in enumerate(test) if not e.isdigit()), '0')
resolve-lo para o caso de string vazia
. capitalize
também transformará outros caracteres para abaixar. De docs oficiais: "Return uma versão titlecased de S, palavras ou seja, início com caracteres em caixa título, todas as restantes personagens encaixotados têm minúsculas. "
Somente porque ninguém mais o mencionou:
>>> 'bob'.title()
'Bob'
>>> 'sandy'.title()
'Sandy'
>>> '1bob'.title()
'1Bob'
>>> '1sandy'.title()
'1Sandy'
No entanto, isso também daria
>>> '1bob sandy'.title()
'1Bob Sandy'
>>> '1JoeBob'.title()
'1Joebob'
ou seja, não apenas coloca em maiúscula o primeiro caractere alfabético. Mas então .capitalize()
tem o mesmo problema, pelo menos nisso 'joe Bob'.capitalize() == 'Joe bob'
, então meh.
Isso é semelhante à resposta do @ Anon, pois mantém intacto o restante do caso da string, sem a necessidade do módulo 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
Como o @Xan apontou, a função poderia usar mais verificação de erros (como verificar se x é uma sequência - no entanto, estou omitindo casos extremos para ilustrar a técnica)
Atualizado por comentário @normanius (obrigado!)
Graças a @GeoStoneMarten ao apontar que não respondi à pergunta! -fixed that
len(x) == 0
ramo.
return x[0].upper() + x[1:] if len(x) > 0 else x
capitalize
& title
primeiro minúscula a seqüência inteira e, em seguida, maiúscula apenas a primeira letra.
a[:1].upper() + a[1:]
, isso cuidará da caixa de len(X)==0
canto.
uma linha: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))