Pythonで文字列を扱うとき、入力のゆらぎ(大文字や小文字の違い)を揃えるのはとても重要です。
本記事では、初心者の方でもつまずかないように、lower()
とupper()
を中心に、使いどころ、注意点、関連メソッドまで段階的に解説します。
実行結果付きのサンプルコードで確実に理解を深めましょう。
Pythonのlower()で小文字化
基本の書き方とコード例
lower()
は文字列中のアルファベットを小文字に変換します。
元の文字列は変更されず、新しい文字列が返されます(文字列は不変のデータ型です)。
# lower() の基本
text = "Hello, World! 123"
lowered = text.lower() # すべて小文字化した新しい文字列を作る
print("元の文字列:", text)
print("小文字化:", lowered)
print("元の文字列は変更されません:", text) # text はそのまま
元の文字列: Hello, World! 123
小文字化: hello, world! 123
元の文字列は変更されません: Hello, World! 123
英数字以外の記号やスペース、数字はそのまま残る点も確かめておくと安心です。
検索や比較の前処理に使う
ユーザー入力などは大文字小文字が混在しがちです。
比較の前に双方を小文字に揃えることで、意図せぬ不一致を防げます。
# 例: 大文字小文字を無視して検索する
fruits = ["Apple", "banana", "Grape", "BANANA"]
query = "BaNaNa"
# 1) 小文字にそろえた一覧を用意してメンバーシップを判定
normalized = [f.lower() for f in fruits]
found = query.lower() in normalized
# 2) 小文字にそろえて一致した要素を抽出
matches = [f for f in fruits if f.lower() == query.lower()]
# 3) 大文字小文字を無視して並べ替え(key=str.lower を使う)
sorted_ignore_case = sorted(fruits, key=str.lower)
print("小文字に正規化した一覧:", normalized)
print("queryを含むか(大文字小文字無視):", found)
print("一致した要素:", matches)
print("小文字基準でソート:", sorted_ignore_case)
小文字に正規化した一覧: ['apple', 'banana', 'grape', 'banana']
queryを含むか(大文字小文字無視): True
一致した要素: ['banana', 'BANANA']
小文字基準でソート: ['Apple', 'banana', 'BANANA', 'Grape']
検索や重複チェック、並べ替えなど、比較が関わる処理ではまずlower()
で統一するのが実務でも定番です。
複数の文字列をまとめて小文字にする
リストや辞書のようなまとまったデータを一括で小文字化すると便利です。
リスト内包表記やmap()
を使った例を示します。
# リストを一括で小文字化
paths = ["README.TXT", "setup.PY", "notes.MD"]
lowered_list = [p.lower() for p in paths] # リスト内包表記
lowered_list_map = list(map(str.lower, paths)) # map を使う方法(どちらでもOK)
print("元のリスト:", paths)
print("小文字化(内包表記):", lowered_list)
print("小文字化(map):", lowered_list_map)
# 辞書のキーを小文字化して揺れを統一(新しい辞書を作る)
headers = {"Content-Type": "text/plain", "accept": "application/json", "HOST": "example.com"}
headers_lower = {k.lower(): v for k, v in headers.items()}
print("元のヘッダー:", headers)
print("キーを小文字化:", headers_lower)
元のリスト: ['README.TXT', 'setup.PY', 'notes.MD']
小文字化(内包表記): ['readme.txt', 'setup.py', 'notes.md']
小文字化(map): ['readme.txt', 'setup.py', 'notes.md']
元のヘッダー: {'Content-Type': 'text/plain', 'accept': 'application/json', 'HOST': 'example.com'}
キーを小文字化: {'content-type': 'text/plain', 'accept': 'application/json', 'host': 'example.com'}
大量データでは一度だけ正規化してから使い回すと無駄な再計算を防げます。
Pythonのupper()で大文字化
基本の書き方とコード例
upper()
はアルファベットを大文字に変換します。
こちらも元の文字列は変更されず、新しい文字列が返ります。
# upper() の基本
msg = "hello, Python 3"
uppered = msg.upper()
print("元の文字列:", msg)
print("大文字化:", uppered)
print("元の文字列は変更されません:", msg)
元の文字列: hello, Python 3
大文字化: HELLO, PYTHON 3
元の文字列は変更されません: hello, Python 3
表示やラベルのフォーマットに使う
画面表示やログのラベルは大文字で目立たせると読みやすくなります。
# 例: ラベルや見出しを大文字で整形
status = "ok"
message = "Disk almost full"
label_line = "STATUS: " + status.upper() # ラベルを大文字で
warn_line = "WARNING: " + message # 固定のラベルはもともと大文字
# 複数の項目を表示用に大文字へ
columns = ["id", "name", "score"]
columns_upper = [c.upper() for c in columns]
print(label_line)
print(warn_line)
print("列見出し:", columns_upper)
STATUS: OK
WARNING: Disk almost full
列見出し: ['ID', 'NAME', 'SCORE']
外部へ見せる文字列は視認性を意識し、表示直前でupper()
するのが分かりやすい整理方法です。
複数の文字列をまとめて大文字にする
lower()
と同様に、一覧をまとめて大文字にできます。
# リストをまとめて大文字化
tags = ["news", "Update", "release", "NEWS"]
uppered_tags = [t.upper() for t in tags]
print("元のタグ:", tags)
print("大文字化:", uppered_tags)
元のタグ: ['news', 'Update', 'release', 'NEWS']
大文字化: ['NEWS', 'UPDATE', 'RELEASE', 'NEWS']
重複の整理などを行うときは、まず大文字(or 小文字)に正規化してから比較すると簡潔に書けます。
関連メソッドとベストプラクティス
casefoldでより厳密な小文字化
casefold()
はlower()
よりも国際化を考慮した、より強力な小文字化を行います。
ドイツ語のß
のような、単純な小文字化では一致しないケースで特に有用です。
# lower() と casefold() の違い
s1 = "Straße" # ß を含む
s2 = "STRASSE"
print("lower() での比較:", s1.lower() == s2.lower()) # それぞれ 'straße' と 'strasse'
print("casefold() での比較:", s1.casefold() == s2.casefold()) # どちらも 'strasse'
lower() での比較: False
casefold() での比較: True
比較や検索で多言語を扱うときは、両方をcasefold()
してから比較すると安全です。
なお、lower()
やupper()
、casefold()
はいずれもロケール設定ではなくUnicodeの規則に基づきます。
トルコ語のように特殊な大小変換がある言語では表示用途の変換に注意してください。
# casefold() を使った部分一致検索
text = "DIE STRAßE IST LANG" # ß を含む大文字混在の文
query = "strasse"
found = query.casefold() in text.casefold()
print("casefoldで大文字小文字無視の検索:", found)
casefoldで大文字小文字無視の検索: True
capitalizeとtitleとswapcaseの使いどころ
大小変換に関連する整形メソッドも押さえておきましょう。
# 先頭だけ大文字にする capitalize()
s = "hello world! python3"
print("capitalize():", s.capitalize()) # 文頭のみ大文字
# 単語ごとに先頭大文字にする title()
t1 = "hello world! python's title-case test"
t2 = "don't stop believing"
print("title() 1:", t1.title())
print("title() 2:", t2.title()) # アポストロフィの直後も大文字化される点に注意
# 大文字と小文字を反転する swapcase()
mix = "PyThOn"
print("swapcase():", mix.swapcase())
capitalize(): Hello world! python3
title() 1: Hello World! Python'S Title-Case Test
title() 2: Don'T Stop Believing
swapcase(): pYtHoN
title()
は単語の区切りを記号で判定するため、”don’t”が”Don’T”になるなど、英語の正しい表記と異なる場合があります。
人間向けの見出しを厳密に整える必要がある場合は、ライブラリを使うか、個別に置換ルールを設けると良いです。
islowerとisupperで大文字小文字を判定
islower()
とisupper()
は「大小変換の対象となる文字が1つ以上存在し、かつその全てが小文字(大文字)か」を判定します。
数字や記号のみの文字列はFalseになります。
samples = ["abc", "ABC", "Abc", "abc123", "123", "?!", "ß"]
for s in samples:
print(s, "→ islower:", s.islower(), ", isupper:", s.isupper())
abc → islower: True , isupper: False
ABC → islower: False , isupper: True
Abc → islower: False , isupper: False
abc123 → islower: True , isupper: False
123 → islower: False , isupper: False
?! → islower: False , isupper: False
ß → islower: True , isupper: False
大文字小文字の判定に合わせて、必要であればlower()
やupper()
で正規化する、という流れを組み合わせると確実です。
以下にここまで登場した主なメソッドの違いを整理します。
メソッド | 目的 | 主な用途 | 例(入力→出力) |
---|---|---|---|
lower() | 小文字化 | 比較・検索の前処理(簡易) | “Hello” → “hello” |
upper() | 大文字化 | ラベルや見出しの強調 | “ok” → “OK” |
casefold() | 厳密な小文字化 | 多言語対応の比較・検索 | “Straße” → “strasse” |
capitalize() | 文頭のみ大文字 | 文の先頭を整える | “hello world” → “Hello world” |
title() | 単語先頭を大文字 | 見出し風の整形 | “rock’n’roll” → “Rock’N’Roll” |
swapcase() | 大小反転 | 表示効果・簡易整形 | “Py” → “pY” |
ベストプラクティスとして、次の点を覚えておくと実務で役立ちます。
比較はcasefold()
、表示は用途に応じてlower()
またはupper()
、そして処理の直前で必要な最小限の正規化を行うという考え方です。
また、同じ文字列に対して繰り返し正規化するのは避け、結果を変数に保持して再利用すると効率的です。
まとめ
大小のゆらぎを整えるだけで、検索や比較、表示の信頼性は大きく向上します。
基本はlower()
とupper()
で十分ですが、多言語を視野に入れた厳密な比較にはcasefold()
が有効です。
表示用の整形にはcapitalize()
やtitle()
、大小反転にはswapcase()
、状態確認にはislower()
やisupper()
を適切に使い分けましょう。
文字列は不変である点を踏まえ、元の値を必要に応じて新しい変数に保持する習慣をつけると、バグの少ないコードを書けるようになります。