文字列の大文字・小文字変換は、検索や比較、見た目の整形に直結する基本テクニックです。
Pythonでは upper
, lower
, capitalize
, title
といったメソッドで簡単に扱えます。
本記事では4つの使い分けと落とし穴を、出力付きのサンプルコードとともに初心者向けに丁寧に解説します。
Pythonの大文字小文字変換の基本
Pythonの文字列は不変(immutable)です。
upper
や lower
などのメソッドは元の文字列を書き換えず、新しい文字列を返します。
変換はUnicodeに基づくため、英字だけでなく多言語のアルファベットも対象になりますが、大文字・小文字の概念がない文字(日本語など)や記号は変換されません。
次の表は、よく使う4メソッドの目的と挙動の要点です。
メソッド | 目的 | 主な挙動 | 例(入力 -> 出力) |
---|---|---|---|
upper() | すべて大文字にする | アルファベットを大文字化。長さが変わるケースあり(ss→SS) | strasse -> STRASSE |
lower() | すべて小文字にする | アルファベットを小文字化。言語固有の特殊ケースに注意 | İSTANBUL -> i̇stanbul |
capitalize() | 先頭のみ大文字、他は小文字 | 文字列先頭の1文字だけ大文字化、以降はすべて小文字 | hello WORLD -> Hello world |
title() | 単語ごとに先頭を大文字 | 非文字(空白やハイフンなど)で区切って各語の先頭を大文字化。アポストロフィに注意 | they're here -> They'Re Here |
基本挙動と不変性を小さな例で確認します。
# 不変性の確認
s = "Hello"
t = s.upper() # 新しい文字列が返る
print(s) # 元のまま
print(t) # 大文字化された新しい文字列
print(s is t) # 同一オブジェクトではない(不変)
Hello
HELLO
False
upperとlowerの使い方
全体を大文字にする upper
upper()
は対象文字列の大文字にできる部分をすべて大文字にします。
英字だけでなく、ギリシャ文字やキリル文字なども対象です。
一部の文字は大文字化で長さが変わる点に注意します。
# upper の基本
print("Hello, Python 3!".upper())
print("naïve façade coöperate".upper()) # アクセント付き文字も大文字化
print("strasse".upper()) # ss は SS に展開される(長さが増える)
HELLO, PYTHON 3!
NAÏVE FAÇADE COÖPERATE
STRASSE
ポイント
upper()
は表示体裁(見出しやバッジなど)や、入力を正規化して保存する前処理に向いています。
ただし、長さが変わる可能性(ss→SSなど)があるため、インデックスやスライス位置を前提にした処理には注意が必要です。
全体を小文字にする lower
lower()
は対象文字列の小文字にできる部分をすべて小文字にします。
英語だけを扱う場合は比較的安全ですが、多言語では例外的な結果になることもあります(後述)。
# lower の基本
print("HELLO, Python 3!".lower())
print("ÄÖÜ İSTANBUL".lower()) # トルコ語の İ は i + 結合文字「ドット」になる
hello, python 3!
äöü i̇stanbul
ポイント
小文字化して比較する「ケースインセンシティブ比較」の定番ですが、国際化対応が必要なら次節の casefold()
を検討します。
文字列比較や正規化での活用
ユーザー入力の比較や検索を「大文字小文字を無視」して行いたい場面はよくあります。
素朴には両方を lower()
して比較しますが、Unicodeではこれでも一致しない場合があります。
より頑健なのが str.casefold()
による比較です。
大文字小文字を無視した比較は casefold が堅牢
# 素朴なlower比較と、より堅牢なcasefold比較の違い
def equals_lower(a, b):
return a.lower() == b.lower()
def equals_casefold(a, b):
return a.casefold() == b.casefold()
print(equals_lower("Python", "PYTHON")) # True (ASCIIでは問題なし)
print(equals_lower("straße", "STRASSE")) # False (lowerだと揃わない)
print(equals_casefold("straße", "STRASSE")) # True (casefoldなら揃う)
True
False
True
Unicode正規化と組み合わせる
同じ見た目の文字でも、Unicodeでは複数の表現(合成済み・分解済み)があり、そのままでは一致しません。
unicodedata.normalize
と casefold()
を組み合わせると、より確実です。
import unicodedata as ud
# 見た目は同じでも内部表現が異なる2つの文字列
s1 = "café" # 合成済みの é
s2 = "cafe\u0301" # e + 結合分音記号(アキュート)
print(s1 == s2) # そのままでは False
# 正規化(NFC/NFKCなど)とcasefoldを組み合わせた比較
def normalize_for_compare(s: str) -> str:
# 表記ゆれの吸収に強いNFKC + casefoldの一例
return ud.normalize("NFKC", s).casefold()
print(normalize_for_compare(s1) == normalize_for_compare(s2)) # True
False
True
英数字中心なら lower()
でも十分な場面は多いです。
多言語・ユーザー入力の比較では、normalize("NFKC", s).casefold()
のような前処理を用意すると堅牢になります。
capitalizeとtitleの使い分け
先頭だけ大文字にする capitalize
capitalize()
は文字列の先頭1文字を大文字にし、それ以外をすべて小文字にします。
英語の文頭を整える簡易用途に向いていますが、先頭が空白や記号なら何も起きません。
print("hello WORLD".capitalize()) # 文頭だけ大文字、他は小文字
print(" hello".capitalize()) # 先頭が空白だと変化しない
print("mr. robot".capitalize()) # "Mr. robot" になる(頭字語などは崩れる)
Hello world
hello
Mr. robot
注意
文中の頭字語(API)や固有名詞(iPhone、eBay)は崩れます。表示の規則がある場合は個別に制御しましょう。
単語ごとに大文字にする title
title()
は単語の区切り(非文字: 空白・ハイフン・句読点など)ごとに先頭を大文字化し、残りを小文字にします。
英語のタイトル風整形に便利ですが、アポストロフィを含む語では想定外の結果になりがちです。
print("hello world".title())
print("hello-world python".title()) # ハイフンで語が分かれる
print("they're bill's friends".title()) # アポストロフィに注意
Hello World
Hello-World Python
They'Re Bill'S Friends
区切りやアポストロフィの扱い
title()
は、英字以外の文字で語を区切る単純な規則で動きます。
そのため “they’re” のようにアポストロフィを含む語を「They’Re」としてしまいます。
自然な仕上がりにしたい場合は、用途に応じた別手段を検討します。
空白区切りだけにしたい場合は string.capwords
import string
s = "they're bill's friends"
print(s.title()) # str.title の結果
print(string.capwords(s)) # 空白でだけ語を分割して各語の先頭を大文字に
They'Re Bill'S Friends
They're Bill's Friends
より細かく制御したい場合のカスタム関数(例)
正規表現で「英字の連なり」または「英字+アポストロフィ+英字」を1語とみなし、その語内だけを整形する例です。
import re
def smart_title(s: str) -> str:
# 英字(A–Z, a–z)の語、もしくは英字+アポストロフィ+英字を1語として扱う
pattern = re.compile(r"[A-Za-z]+('[A-Za-z]+)?")
def _cap(m: re.Match) -> str:
word = m.group(0)
return word[0].upper() + word[1:].lower()
return pattern.sub(_cap, s)
print(smart_title("they're bill's friends in new-york"))
They're Bill's Friends In New-york
このように、title()
は手軽ですが万能ではありません。
文脈やルールがある表示では、要件に合わせて別アプローチを取りましょう。
よくある落とし穴と注意点
日本語や記号は変換されない
大文字・小文字の概念がない文字(日本語のひらがな・カタカナ・漢字など)や記号・数字は、そのまま残ります。
英字部分だけが変換される結果になる点を理解しておきましょう。
s = "日本語ABC、こんにちは!? 123"
print(s.upper()) # 英字だけ大文字化
print(s.lower()) # 英字だけ小文字化
日本語ABC、こんにちは!? 123
日本語abc、こんにちは!? 123
言語による大小変換の差に注意
Unicodeでは言語固有の大小変換が存在します。
代表例を確認します。
# ドイツ語の ss は大文字で SS に展開される
print("straße".upper()) # STRASSE
print("STRASSE".lower()) # strasse
# 文字数が変わることがある(インデックス・スライスに注意)
print(len("ß"), len("ss".upper())) # 1 2
# トルコ語の I/i は特例がある
print("İstanbul".lower()) # 'i̇stanbul' (i + 結合ドット)
print(repr("İstanbul".lower())) # 内部表現を確認
print("istanbul".upper()) # ISTANBUL (ロケール非依存、İにはならない)
STRASSE
strasse
1 2
i̇stanbul
'i\u0307stanbul'
ISTANBUL
上記の通り、lower()
や upper()
はロケールに依存せずUnicodeの一般規則で変換します。
トルコ語のような特例や、ß
のような長さの変化が関わる場合は、比較・抽出・書式決定の設計に注意が必要です。
比較には casefold()
がより適しています。
用途に応じた選び方の指針
比較・検索で大文字小文字を無視したい場合は、casefold()
を第一候補にします。表記ゆれ(全角/半角、合成/分解)も考慮するなら unicodedata.normalize("NFKC", s).casefold()
のように正規化を組み合わせます。
画面表示の体裁で「すべて大文字」「すべて小文字」が要件なら、upper()
と lower()
を素直に使います。インデックスに依存する処理は変換後の文字数に注意します。
文頭だけ整えたい簡易用途には capitalize()
が便利ですが、頭字語(API)や製品名(iPhone、eBay、macOS)を崩すため、必要に応じて例外ルールを設けます。
タイトル風の整形には title()
がありますが、アポストロフィや固有の大文字小文字規則(McDonald、O’Neill、iOS)に弱いです。string.capwords
やカスタム関数、ドメイン固有の辞書での補正を検討します。
まとめ
本記事では、Pythonの大文字小文字変換で使う4メソッド upper
, lower
, capitalize
, title
の基本と使い分けを解説しました。
upper
と lower
は全体変換、capitalize
と title
は見た目の整形に有効ですが、Unicodeの性質により言語特有の挙動(ss→SS、İの小文字化など)やアポストロフィの扱いに注意が必要です。
比較や検索では casefold()
と unicodedata.normalize
の併用が堅牢で、表示整形では固有名詞や例外ルールの設計が品質を左右します。
目的(比較か表示か)と対象(英数字のみか多言語か)を見極め、最適なメソッドと前処理を選択して、正確で使いやすい文字列処理を実装してください。