python hanya menggunakan huruf pertama

179

Saya sadar .capitalize () mengkapitalisasi huruf pertama dari string tetapi bagaimana jika karakter pertama adalah bilangan bulat?

ini

1bob
5sandy

untuk ini

1Bob
5Sandy
pengguna1442957
sumber

Jawaban:

234

Jika karakter pertama adalah bilangan bulat, itu tidak akan menjadi huruf kapital huruf pertama.

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

Jika Anda menginginkan fungsionalitas, lepas digit, Anda dapat menggunakannya '2'.isdigit()untuk memeriksa setiap karakter.

>>> s = '123sa'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'123Sa'
Ali Afshar
sumber
5
dan itulah yang dilakukan jawaban ini, cukup banyak
njzk2
16
Saya akan menggunakan if c.isalpha () daripada jika tidak c.isdigit ()
njzk2
1
@ Jan-PhilipGehrcke yang merupakan latihan untuk pembaca. Anda dapat melihat dalam hal ini, s tidak pernah kosong, selalu '123sa': D
Ali Afshar
2
@ Jan-PhilipGehrcke: dalam hal ini, next((i for i,e in enumerate(test) if not e.isdigit()), '0')menyelesaikannya untuk kasus string kosong
njzk2
5
Jawaban ini tidak benar. . capitalizejuga akan mengubah karakter lainnya menjadi lebih rendah. Dari dokumen resmi: "Kembalikan versi titlecased S, yaitu kata-kata mulai dengan karakter case judul, semua karakter cased yang tersisa memiliki huruf kecil. "
karantan
246

Hanya karena tidak ada orang lain yang menyebutkannya:

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

Namun, ini juga akan memberi

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

yaitu tidak hanya menggunakan huruf besar karakter alfabet pertama. Tetapi kemudian .capitalize()memiliki masalah yang sama, setidaknya dalam hal itu 'joe Bob'.capitalize() == 'Joe bob', jadi meh.

DSM
sumber
38

Ini mirip dengan jawaban @ Anon karena ini menjaga sisa case string tetap utuh, tanpa perlu modul 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

Seperti yang ditunjukkan oleh @Xan, fungsi tersebut dapat menggunakan lebih banyak pengecekan kesalahan (seperti memeriksa bahwa x adalah suatu urutan - namun saya menghilangkan kasus tepi untuk menggambarkan teknik ini)

Diperbarui per komentar @normanius (terima kasih!)

Terima kasih kepada @GeoStoneMarten dalam menunjukkan bahwa saya tidak menjawab pertanyaan! -memperbaiki itu

pinkwerks
sumber
2
Sangat berguna, tetapi membutuhkan len(x) == 0cabang.
Xan
sejak python 2.5 kasing kosong masih dapat ditangani pada satu baris: return x[0].upper() + x[1:] if len(x) > 0 else x
danio
Jawaban yang sangat berguna, karena capitalize& titlepertama mengurung seluruh string dan kemudian hanya menggunakan huruf pertama.
Jonas Libbrecht
5
Berguna. Cukup gunakan a[:1].upper() + a[1:], ini akan menangani len(X)==0kasus sudut.
normanius
1
Pekerjaan bagus tetapi tidak berfungsi untuk kasus ini karena fungsi ini hanya menggunakan huruf kapital pertama dan kata kunci pertama adalah digit bukan teks. Anda perlu membagi angka dan angka sebelum digunakan dan bergabung dengan hasil dalam kasus ini.
GeoStoneMarten
13

Berikut ini adalah satu-liner yang akan huruf besar huruf pertama dan meninggalkan huruf semua huruf berikutnya:

import re

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

Ini akan menghasilkan WordsWithOtherUppercaseLetters

Segera
sumber
4

Seperti yang dilihat di sini dijawab oleh Chen Houwu, dimungkinkan untuk menggunakan paket string:

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

Saya datang dengan ini:

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
Prasanth
sumber
1

Anda dapat mengganti huruf pertama ( preceded by a digit) dari setiap kata menggunakan regex:

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

output:
 1Bob 5Sandy
Kenly
sumber
1

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

Gürol Canbek
sumber
Saya pikir maksud Anda ini bukan? '' .join (sub [: 1] .upper () + sub [1:] untuk sub di text.split (''))
Michael
Dikoreksi. Terima kasih
@Michael