Bir dizedeki her kelimenin ilk harfi nasıl büyük yazılır?

s = 'the brown fox'

...burada bir şeyler yap...

s olmalıdır:

'The Brown Fox'

Bunu yapmanın en kolay yolu nedir?

Çözüm

Bir dizenin .title() yöntemi (ASCII veya Unicode olması fark etmez) bunu yapar:

>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'

Ancak, dokümanlarda belirtildiği gibi gömülü kesme işaretleri içeren dizelere dikkat edin.

Algoritma, bir kelimenin ardışık harf grupları olarak dilden bağımsız basit bir tanımını kullanır. Bu tanım birçok bağlamda işe yarar ancak bu, kısaltmalar ve iyeliklerdeki kesme işaretlerinin kelime sınırları oluşturduğu anlamına gelir ve bu istenen sonuç olmayabilir:

"onlar'bill'in İngiltere'den arkadaşları".title() "Onlar Bill'in İngiltere'den arkadaşları.

Yorumlar (6)

Sırf bu tür şeyler benim için eğlenceli olduğu için, işte iki çözüm daha.

Kelimelere bölün, bölünen gruplardaki her kelimeyi ilk harfleriyle yazın ve yeniden birleştirin. Bu, kelimeleri ayıran beyaz boşluğu, ne olursa olsun tek bir beyaz boşluğa dönüştürecektir.

s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)

EDIT: Yukarıdaki kodu yazarken ne düşündüğümü hatırlamıyorum, ancak açık bir liste oluşturmaya gerek yok; bunu tembel bir şekilde yapmak için bir jeneratör ifadesi kullanabiliriz. İşte daha iyi bir çözüm:

s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())

Dizenin başlangıcını veya sözcükleri ayıran beyaz boşluğu ve beyaz boşluk olmayan tek bir karakteri eşleştirmek için normal ifade kullanın; "match groups" işaretlemek için parantez kullanın. Bir eşleşme nesnesi alan ve beyaz boşluk eşleşme grubunu değiştirmeden ve beyaz boşluk olmayan karakter eşleşme grubunu büyük harf olarak döndüren bir fonksiyon yazın. Ardından kalıpları değiştirmek için re.sub() işlevini kullanın. Bu çözümde ne ilk çözümdeki noktalama işaretleri sorunları var ne de ilk çözümümdeki gibi beyaz boşluğu yeniden yapıyor. Bu en iyi sonucu üretir.

import re
s = 'the brown fox'

def repl_func(m):
    """process regular expression match groups for word upper-casing problem"""
    return m.group(1) + m.group(2).upper()

s = re.sub("(^|\s)(\S)", repl_func, s)

>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"

Bu cevabı araştırdığım için memnunum. re.sub()ın bir fonksiyon alabileceği hakkında hiçbir fikrim yoktu! Nihai sonucu üretmek içinre.sub()` içinde önemsiz işlemler yapabilirsiniz!

Yorumlar (5)

Eğer str.title() sizin için çalışmazsa, büyük harf kullanımını kendiniz yapın.

  1. Dizeyi bir sözcük listesine bölme
  2. Her kelimenin ilk harfini büyük yazın
  3. Kelimeleri tek bir dizede birleştirin

Tek satırlık:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

Açık bir örnek:

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)
Yorumlar (1)