閉じる

Pythonの大文字小文字変換(upper, lower, capitalize, title)の使い方

文字列の大文字・小文字変換は、検索や比較、見た目の整形に直結する基本テクニックです。

Pythonでは upper, lower, capitalize, title といったメソッドで簡単に扱えます。

本記事では4つの使い分けと落とし穴を、出力付きのサンプルコードとともに初心者向けに丁寧に解説します。

Pythonの大文字小文字変換の基本

Pythonの文字列は不変(immutable)です。

upperlower などのメソッドは元の文字列を書き換えず、新しい文字列を返します。

変換はUnicodeに基づくため、英字だけでなく多言語のアルファベットも対象になりますが、大文字・小文字の概念がない文字(日本語など)や記号は変換されません。

次の表は、よく使う4メソッドの目的と挙動の要点です。

メソッド目的主な挙動例(入力 -> 出力)
upper()すべて大文字にするアルファベットを大文字化。長さが変わるケースあり(ss→SS)strasse -> STRASSE
lower()すべて小文字にするアルファベットを小文字化。言語固有の特殊ケースに注意İSTANBUL -> i̇stanbul
capitalize()先頭のみ大文字、他は小文字文字列先頭の1文字だけ大文字化、以降はすべて小文字hello WORLD -> Hello world
title()単語ごとに先頭を大文字非文字(空白やハイフンなど)で区切って各語の先頭を大文字化。アポストロフィに注意they're here -> They'Re Here

基本挙動と不変性を小さな例で確認します。

Python
# 不変性の確認
s = "Hello"
t = s.upper()  # 新しい文字列が返る

print(s)       # 元のまま
print(t)       # 大文字化された新しい文字列
print(s is t)  # 同一オブジェクトではない(不変)
実行結果
Hello
HELLO
False

upperとlowerの使い方

全体を大文字にする upper

upper() は対象文字列の大文字にできる部分をすべて大文字にします。

英字だけでなく、ギリシャ文字やキリル文字なども対象です。

一部の文字は大文字化で長さが変わる点に注意します。

Python
# 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() は対象文字列の小文字にできる部分をすべて小文字にします。

英語だけを扱う場合は比較的安全ですが、多言語では例外的な結果になることもあります(後述)

Python
# lower の基本
print("HELLO, Python 3!".lower())
print("ÄÖÜ İSTANBUL".lower())  # トルコ語の İ は i + 結合文字「ドット」になる
実行結果
hello, python 3!
äöü i̇stanbul

ポイント

小文字化して比較する「ケースインセンシティブ比較」の定番ですが、国際化対応が必要なら次節の casefold() を検討します。

文字列比較や正規化での活用

ユーザー入力の比較や検索を「大文字小文字を無視」して行いたい場面はよくあります。

素朴には両方を lower() して比較しますが、Unicodeではこれでも一致しない場合があります。

より頑健なのが str.casefold() による比較です。

大文字小文字を無視した比較は casefold が堅牢

Python
# 素朴な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.normalizecasefold() を組み合わせると、より確実です。

Python
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文字を大文字にし、それ以外をすべて小文字にします。

英語の文頭を整える簡易用途に向いていますが、先頭が空白や記号なら何も起きません。

Python
print("hello WORLD".capitalize())   # 文頭だけ大文字、他は小文字
print("  hello".capitalize())       # 先頭が空白だと変化しない
print("mr. robot".capitalize())     # "Mr. robot" になる(頭字語などは崩れる)
実行結果
Hello world
  hello
Mr. robot

注意

文中の頭字語(API)や固有名詞(iPhone、eBay)は崩れます。表示の規則がある場合は個別に制御しましょう。

単語ごとに大文字にする title

title()単語の区切り(非文字: 空白・ハイフン・句読点など)ごとに先頭を大文字化し、残りを小文字にします。

英語のタイトル風整形に便利ですが、アポストロフィを含む語では想定外の結果になりがちです。

Python
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

Python
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語とみなし、その語内だけを整形する例です。

Python
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() は手軽ですが万能ではありません。

文脈やルールがある表示では、要件に合わせて別アプローチを取りましょう。

よくある落とし穴と注意点

日本語や記号は変換されない

大文字・小文字の概念がない文字(日本語のひらがな・カタカナ・漢字など)や記号・数字は、そのまま残ります。

英字部分だけが変換される結果になる点を理解しておきましょう。

Python
s = "日本語ABC、こんにちは!? 123"
print(s.upper())  # 英字だけ大文字化
print(s.lower())  # 英字だけ小文字化
実行結果
日本語ABC、こんにちは!? 123
日本語abc、こんにちは!? 123

言語による大小変換の差に注意

Unicodeでは言語固有の大小変換が存在します。

代表例を確認します。

Python
# ドイツ語の 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 の基本と使い分けを解説しました。

upperlower は全体変換、capitalizetitle は見た目の整形に有効ですが、Unicodeの性質により言語特有の挙動(ss→SS、İの小文字化など)やアポストロフィの扱いに注意が必要です。

比較や検索では casefold()unicodedata.normalize の併用が堅牢で、表示整形では固有名詞や例外ルールの設計が品質を左右します。

目的(比較か表示か)と対象(英数字のみか多言語か)を見極め、最適なメソッドと前処理を選択して、正確で使いやすい文字列処理を実装してください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!