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

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'

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.


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


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


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"

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

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

1

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


Saya pikir maksud Anda ini bukan? '' .join (sub [: 1] .upper () + sub [1:] untuk sub di text.split (''))
Michael

Dikoreksi. Terima kasih
@Michael
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.