実務でも学習でも、文字列の大文字小文字を整える場面は頻繁にあります。
本記事では、Pythonのupper
、lower
、capitalize
、title
の4つに絞り、基本から使い分け、注意点まで丁寧に解説します。
見出しの整形や比較の前処理など、よくある用途もあわせて紹介します。
Pythonの大文字小文字変換の基本
大文字小文字変換とは
英字の文字列に対して大文字と小文字を変換することを指します。
Pythonではstr
型がメソッドとしてupper()
、lower()
、capitalize()
、title()
を提供しており、それぞれが異なる粒度で文字の大文字小文字を切り替えます。
なお、英字以外の記号や数字は基本的に変化しません。
文字列はイミュータブル
Pythonの文字列はイミュータブル(変更不可)です。
そのため、upper()
などを呼び出しても元の文字列は変わらず、新しい文字列が返されます。
変換結果を使いたい場合は再代入が必要です。
# 元の文字列は変わらない例
s = "Hello"
t = s.upper() # 新しい文字列 "HELLO" が返る
print(s) # そのまま
print(t) # 変換後
Hello
HELLO
- 関連記事:変数の使い方完全入門
- 関連記事:文字列と数値の型を変換したい
主な用途(比較・表示・正規化)
用途は大きく3つに分けられます。
1つ目は比較前の正規化で、ユーザー入力と定義済みキーワードを大小区別しないで比較したいときにlower()
を使います。
2つ目は表示整形で、見出しや文章の先頭だけを整えるときにtitle()
やcapitalize()
が役立ちます。
3つ目はIDやコードの統一で、製品コードや16進文字列をupper()
して統一感を出すと読み間違いを防げます。
upper/lower/capitalize/titleの使い方
以下は4つのメソッドの概要です。
メソッド | 変換の粒度 | 主な対象 | 例 | 想定用途 |
---|---|---|---|---|
upper() | 全部を大文字 | 英字 | “Hello” → “HELLO” | IDやコードの統一、強調表示 |
lower() | 全部を小文字 | 英字 | “Hello” → “hello” | 比較前の正規化、検索 |
capitalize() | 先頭のみ大文字、他は小文字 | 文字列全体 | “hELLO world” → “Hello world” | 文頭の整形 |
title() | 単語ごとに先頭を大文字、他は小文字 | 空白などで区切られた単語 | “hello world” → “Hello World” | 見出しの整形 |
- 関連記事:比較で使うisと==の違い
upperの使い方(全て大文字)
upper()
は文字列内の英字をすべて大文字にします。
記号や数字は変化しません。
# upper() の基本
s = "id: ab-12cd, section 3"
print(s.upper())
ID: AB-12CD, SECTION 3
製品コードや16進文字列は、統一して大文字にしておくと視認性が上がり、混乱を減らせます。
- 関連記事:replaceで文字列を置換する
lowerの使い方(全て小文字)
lower()
は英字をすべて小文字にします。
検索や比較の前処理として多用します。
# lower() の基本
keyword = "Python"
user = "pyTHon"
print(keyword.lower() == user.lower()) # 大文字小文字を無視した比較
True
capitalizeの使い方(先頭のみ大文字)
capitalize()
は文字列全体の先頭だけを大文字にし、それ以外は小文字にします。
文頭の整形に向いています。
# capitalize() の基本
s = "hELLO world. PYTHON!"
print(s.capitalize())
Hello world. python!
文中の固有名詞まで小文字になってしまうため、固有名詞を含む文章には不向きな場合があります。
titleの使い方(単語ごとに大文字)
title()
は単語ごとに先頭を大文字、残りを小文字にします。
見出しの整形に便利です。
# title() の基本
s = "learn python in 10 minutes"
print(s.title())
Learn Python In 10 Minutes
英文のスタイルガイドに沿った厳密なタイトルケース(前置詞は小文字など)ではありません。
あくまで機械的な変換です。
違いと使い分け(upper/lower/capitalize/title)
upper()
とlower()
は全文字を一括で変換し、capitalize()
とtitle()
は位置や単語境界に応じて変換します。- 文頭だけ整えるなら
capitalize()
、見出しならtitle()
、比較の前処理ならlower()
、コード統一はupper()
が基本です。
入力 | upper | lower | capitalize | title |
---|---|---|---|---|
“Hello world” | “HELLO WORLD” | “hello world” | “Hello world” | “Hello World” |
“e-mail today” | “E-MAIL TODAY” | “e-mail today” | “E-mail today” | “E-Mail Today” |
“hELLO PYTHON” | “HELLO PYTHON” | “hello python” | “Hello python” | “Hello Python” |
実践パターン
比較前の正規化(lower)
ユーザー入力とキーワードを大小無視で比較する例です。
両方をlower()
してから比較します。
# ログインIDを大小無視で照合する例
valid_ids = {"admin", "guest", "alice"}
user_input = "AdMiN"
is_valid = user_input.lower() in {x.lower() for x in valid_ids}
print(is_valid)
True
見出しの整形(title)と文頭(capitalize)
見出しはtitle()
、本文の最初の文だけならcapitalize()
が適しています。
# 見出しと本文の整形
heading = "introduction to python programming"
first_sentence = "tHis is a Beginner-friendly guide."
print(heading.title()) # 見出し
print(first_sentence.capitalize()) # 文頭
Introduction To Python Programming
This is a beginner-friendly guide.
IDやコードの統一(upper)
製品コードや16進ダンプなどは大文字で統一すると読みやすくなります。
# コードの正規化
codes = ["ab12", "Ab13", "aF00", "zz9"]
normalized = [c.upper() for c in codes]
print(normalized)
['AB12', 'AB13', 'AF00', 'ZZ9']
チェーンのコツ(lower→capitalize)
「文頭のみ大文字、その他はすべて小文字」にしたい場合、lower()
で一度正規化してからcapitalize()
を適用すると安定します。
# lower → capitalize のチェーン
s = "hELLO PYTHON, wELcOMe!"
result = s.lower().capitalize()
print(result)
Hello python, welcome!
記号・数字は変化しない
記号や数字は原則として変化しません。
英字だけが対象です。
# 記号・数字はそのまま
s = "ver-2.0 build#45 @2025/09"
print(s.upper())
print(s.lower())
VER-2.0 BUILD#45 @2025/09
ver-2.0 build#45 @2025/09
- 関連記事:文字列の結合と繰り返し
注意点
Unicodeの大小変換はロケール非依存
Pythonの大小変換はロケール(地域設定)に依存しません。
たとえばトルコ語の<i>i</i>/<i>I</i>の特殊事情は考慮されません。
そのため期待と異なる結果になることがあります。
# トルコ語の i/I の例
print("istanbul".upper()) # 期待: İSTANBUL (トルコ語) だが…
print("İ".lower()) # I にドットが付く複合文字へ
print("I".lower()) # ドットなしの小文字にはならない
ISTANBUL
i̇
i
補足として、大小無視の比較ではlower()
よりもより強力な正規化手段であるcasefold()
が適する場合があります。
ただし本記事の主題はupper/lower/capitalize/title
ですので詳細は割愛します。
titleの単語境界(アポストロフィ/ハイフン)
title()
はアポストロフィやハイフンで単語を区切るため、期待しない結果になることがあります。
# title() の単語境界の挙動
print("don't stop".title()) # "Don'T Stop" になる
print("rock'n'roll".title()) # "Rock'N'Roll"
print("e-mail address".title()) # "E-Mail Address"
Don'T Stop
Rock'N'Roll
E-Mail Address
アポストロフィを含む英文見出しを自然にしたい場合は、空白単位で分割してcapitalize()
を適用する方法が有効です。
標準ライブラリのstring.capwords()
も同様の動作をします。
import string
s = "don't stop believing"
print(" ".join(w.capitalize() for w in s.split())) # 手作り版
print(string.capwords(s)) # 標準ライブラリ
Don't Stop Believing
Don't Stop Believing
特殊文字の挙動(ß, İ など)
Unicode仕様により、1文字が複数文字に変換されることがあります。
ドイツ語の ß は大文字にすると “SS”となるのが代表例です。
# 特殊文字の大小変換
print("straße".upper()) # ß → SS
print("ẞ".lower()) # 大文字のエスツェットは小文字に戻る
STRASSE
ß
このように文字数が変化するため、インデックスやスライスの位置がずれる可能性に注意してください。
大量データ時のパフォーマンス
- 同じ変換を何度も行う場合は、一度だけ変換して再利用します。
- ループ内ではバインドしたメソッドを使うとわずかに速くなることがあります。
# 大量の行を upper() にかける効率的な例
lines = ["line" + str(i) for i in range(100_000)]
# 悪い例: 毎回属性探索
res1 = [s.upper() for s in lines]
# よい例: メソッドをローカル変数にバインド
to_upper = str.upper
res2 = [to_upper(s) for s in lines]
print(len(res1), len(res2))
100000 100000
また、生成した結果をすぐ出力するのでなければ、必要なときにだけ遅延実行(mapなど)する方法も検討してください。
再代入が必要(元の文字列は変わらない)
繰り返しになりますが、文字列はイミュータブルです。
元の変数に反映したい場合は再代入が必要です。
s = "hello"
s.upper() # 返り値を捨てると反映されない
print(s) # 変化なし
s = s.upper() # 再代入して反映
print(s)
hello
HELLO
まとめ
大文字小文字変換は、比較前の正規化、見た目の整形、コード表記の統一など幅広い用途で使います。
文字列はイミュータブルで、upper/lower/capitalize/title
はそれぞれ変換の粒度が異なる点を押さえましょう。
特にUnicode特有の挙動(アポストロフィやß、トルコ語のIなど)とロケール非依存であることは重要です。
基本は、比較にはlower()
、見出しにはtitle()
、文頭にはcapitalize()
、統一にはupper()
という使い分けを覚えておくと、実務でも迷いません。
必要に応じて、分割とcapitalize()
の組み合わせや、より厳密な比較ではcasefold()
の活用も検討してください。