python mette in maiuscolo solo la prima lettera


179

Sono consapevole .capitalize () mette in maiuscolo la prima lettera di una stringa, ma cosa succede se il primo carattere è un numero intero?

Questo

1bob
5sandy

a questa

1Bob
5Sandy

Risposte:


234

Se il primo carattere è un numero intero, non capitalizzerà la prima lettera.

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

Se si desidera la funzionalità, rimuovere le cifre, è possibile utilizzare '2'.isdigit()per verificare ogni carattere.

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

5
e questo è ciò che fa questa risposta, praticamente
njzk2,

16
Vorrei usare se c.isalpha () anziché se non c.isdigit ()
njzk2

1
@ Jan-PhilipGehrcke che è un esercizio per il lettore. In questo caso puoi vedere, s non è mai vuoto, è sempre "123sa": D
Ali Afshar

2
@ Jan-PhilipGehrcke: nel qual caso, lo next((i for i,e in enumerate(test) if not e.isdigit()), '0')risolve per il caso stringa vuota
njzk2

5
Questa risposta non è corretta . capitalizetrasformerà anche altri caratteri in basso. Dai documenti ufficiali: "Restituisci una versione titolata di S, cioè le parole iniziano con caratteri maiuscoli, tutti i caratteri maiuscoli restanti hanno
lettere

246

Solo perché nessun altro l'ha menzionato:

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

Tuttavia, questo darebbe anche

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

cioè non si tratta solo di capitalizzare il primo carattere alfabetico. Ma poi .capitalize()ha lo stesso problema, almeno in quello 'joe Bob'.capitalize() == 'Joe bob', quindi meh.


38

Questo è simile alla risposta di @ Anon in quanto mantiene intatto il resto del caso della stringa, senza la necessità del modulo 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

Come ha sottolineato @Xan, la funzione potrebbe utilizzare un maggiore controllo degli errori (come verificare che x sia una sequenza, tuttavia sto omettendo i casi limite per illustrare la tecnica)

Aggiornato per commento @normanius (grazie!)

Grazie a @GeoStoneMarten nel sottolineare che non ho risposto alla domanda! risolto questo


2
Molto utile, ma ha bisogno di un len(x) == 0ramo.
Xan,

da Python 2.5 il caso vuoto può ancora essere gestito su una riga: return x[0].upper() + x[1:] if len(x) > 0 else x
danio,

Risposta molto utile, perché capitalize& titleprima minuscola l'intera stringa e poi maiuscola solo la prima lettera.
Jonas Libbrecht,

5
Utile. Basta usare a[:1].upper() + a[1:], questo si occuperà del len(X)==0caso d'angolo.
normanio

1
Ottimo lavoro, ma in questo caso non funziona perché questa funzione utilizza solo il primo carattere e il primo carattere è cifra non testo. È necessario dividere i numeri e le cifre prima dell'uso e in questo caso unire i risultati.
GeoStoneMarten,

13

Ecco una riga che metterà in maiuscolo la prima lettera e lascerà il caso di tutte le lettere successive:

import re

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

Ciò comporterà WordsWithOtherUppercaseLetters


4

Come visto qui risposto da Chen Houwu, è possibile usare un pacchetto di stringhe:

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

1

Ho pensato a questo:

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

Puoi sostituire la prima lettera ( preceded by a digit) di ogni parola usando regex:

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

output:
 1Bob 5Sandy

1

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


Penso che intendi questo vero? '' .join (sub [: 1] .upper () + sub [1:] per sub in text.split (''))
Michael

Corretto. Grazie
@Michael
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.