文字列中の各単語の最初の文字を大文字にするには?

s = 'the brown fox'

...ここで何かをする...

s` は :

'The Brown Fox'

一番簡単な方法は何でしょうか?

ソリューション

文字列(ASCIIでもUnicodeでも構いません)の.title()メソッドで行うことができます。

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

ただし、ドキュメントに記載されているように、アポストロフィーが埋め込まれた文字列には注意が必要です。

このアルゴリズムでは、言語に依存しない、連続した文字のグループとしての単語の単純な定義を使用しています。この定義は多くの文脈で機能しますが、短縮形や所有格のアポストロフィーが単語の境界を形成することになり、これは望ましい結果ではないかもしれません。

"they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"

解説 (6)

このようなことが楽しいので、さらに2つの解決策を紹介します。

単語に分割し、分割されたグループからそれぞれの単語をイニシャルカプして、再結合する。 これにより、単語の間にあった空白は、何があっても1つの空白に変わります。

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

EDIT: 上のコードを書いたときに何を考えていたか覚えていませんが、明示的なリストを作る必要はありません。ジェネレーター式を使って遅延的に行うことができます。 そこで、より良い解決策を考えてみました。

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

正規表現を使用して、文字列の先頭、単語を区切る空白、および空白以外の1文字にマッチさせます。 マッチオブジェクトを受け取り、空白のマッチグループを変更せずに、空白以外の文字のマッチグループを大文字で返す関数を書いてください。 そして、re.sub()を使ってパターンを置き換えます。 この方法では、最初の解決策のような句読点の問題はありませんし、私の最初の解決策のようにホワイトスペースをやり直すこともありません。 この方法が最も良い結果をもたらします。

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"

この回答を調べておいてよかったです。 re.sub()に関数が入るとは知りませんでした。 re.sub()の中で非自明な処理をして最終的な結果を出すことができるのですね。

解説 (5)

str.title()がうまくいかない場合は、自分で大文字にしてください。

1.文字列を単語のリストに分割する 2.各単語の最初の文字を大文字にする 3.各単語を1つの文字列にまとめる

ワンライナー。

>>> ' '.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"

わかりやすい例。

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)
解説 (1)