sadece ilk harfi büyük harfle kullanın


179

.Capitalize () işlevinin bir dizenin ilk harfini büyük yazdığını biliyorum, ama ya ilk karakter bir tamsayı ise?

bu

1bob
5sandy

buna

1Bob
5Sandy

Yanıtlar:


234

İlk karakter bir tamsayı ise, ilk harfi büyük yazmaz.

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

İşlevselliği istiyorsanız, basamakları ayırın, '2'.isdigit()her karakteri kontrol etmek için kullanabilirsiniz .

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

5
ve bu cevabın yaptığı şey, hemen hemen
njzk2

16
Eğer c.isdigit () yerine c.isalpha () kullanırdım
njzk2 13:01 '

1
@ Jan-PhilipGehrcke bu okuyucu için bir alıştırma. Bu durumda görebilirsiniz, s asla boş değil, her zaman '123sa': D
Ali Afshar

2
@ Jan-PhilipGehrcke: bu durumda, next((i for i,e in enumerate(test) if not e.isdigit()), '0')boş dize davası için çözer
njzk2

5
Bu cevap doğru değil. . capitalizeayrıca diğer karakterleri daha düşük seviyeye dönüştürür. Resmi dokümanlardan: "S'nin başlıklı bir sürümünü döndürün, yani kelimeler başlık harfleri ile başlar, kalan tüm kasa karakterleri küçük
harflidir

246

Başka hiç kimse bundan bahsetmediği için:

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

Ancak, bu da

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

yani sadece ilk alfabetik karakteri büyük harfle yazmaz. Ama sonra .capitalize()aynı sorun var, en azından 'joe Bob'.capitalize() == 'Joe bob'bunda, yani meh.


38

Bu, @ Anon'un cevabına benzer, çünkü dize kasasının geri kalanını re modülüne ihtiyaç duymadan sağlam tutar.

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

@Xan'ın işaret ettiği gibi, fonksiyon daha fazla hata kontrolü kullanabilir (x'in bir dizi olduğunu kontrol etmek gibi - ancak tekniği göstermek için uç durumları atlıyorum)

@Normanius yorumu başına güncellendi (teşekkürler!)

@GeoStoneMarten'a işaret ederek soruyu cevaplamadım! düzeltildi


2
Çok faydalı, ancak bir len(x) == 0şubeye ihtiyacı var .
Xan

Python 2.5'ten beri boş kasa hala bir satırda ele alınabilir: return x[0].upper() + x[1:] if len(x) > 0 else x
danio

Çok yararlı cevap, çünkü capitalize& titleilk tam dizeyi küçük harfe ve sonra sadece ilk harfi büyük harfe.
Jonas Libbrecht

5
Kullanışlı. Sadece kullanın a[:1].upper() + a[1:], bu len(X)==0köşe kasasına dikkat edecektir .
normanius

1
İyi iş ama bu durumda işe yarama çünkü bu fonksiyon sadece ilk karakterden çıkar ve ilk karakterden metin değil rakam. Kullanmadan önce sayısal ve basamaklı bölünmeler yapmanız ve bu durumda sonuca katılmanız gerekir.
GeoStoneMarten

13

İşte ilk harfi büyük olacak ve sonraki tüm harflerin durumunu bırakacak bir astar:

import re

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

Bu, WordsWithOtherUppercaseLetters


4

Burada Chen Houwu tarafından cevaplandığı gibi , dize paketi kullanmak mümkündür:

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

1

Ben bununla geldim:

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

preceded by a digitNormal ifadeyi kullanarak her kelimenin ilk harfini ( ) değiştirebilirsiniz :

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

output:
 1Bob 5Sandy

1

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


Sanırım bunu demek istiyorsun değil mi? '' .join (sub [: 1] .upper () + sub [1:] text.split ('')) içindeki alt öğeler için
Michael

Düzeltildi. Michael
Gürol Canbek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.