HOWTO · Python

Python での大文字小文字を区別しない文字列の比較

Python で大文字小文字を区別しない文字列比較を行うためには、主に lower(), upper(), casefold() の 3つのメソッドがあります。

このページの内容

Python で大文字と小文字を区別せずに文字列を比較するには、両方の文字列を同じメソッドで正規化してから、その結果を比較します。通常の比較には lower() または upper() を使えます。ß と ss を同等に扱うなど、Unicode の大文字小文字を無視した照合が必要な場合は casefold() を選びましょう。

lower() で大文字と小文字を区別せずに文字列を比較する

組み込みの lower() メソッドは、文字列を小文字に変換した新しい文字列を返します。両方の値に lower() を適用してから == で比較すると、Hello World! と HELLO WORLD! のように大文字小文字だけが異なる文字列は等しいと判定されます。このメソッドは一般的な大小文字の変換に対応しますが、Unicode のケースフォールディング規則をすべて適用するわけではありません。比較する両方の値を同じ方法で正規化してください。片方だけを変換すると、一致するはずの文字列でも等しくならないことがあります。返されるのは新しい文字列なので、元の表記は表示や保存に使えます。

次の自己完結した例では、大文字小文字の異なる2つの値を比較し、真偽値を出力します。コード内の英語の例示文字列はそのまま表示されます。

first = "Hello World!"
second = "HELLO WORLD!"

print(first.lower() == second.lower())
True

一致する入力では、比較結果は True になります。表記や表示上の大文字小文字を保ちたい場合は、元の文字列を使ってください。lower() は新しい文字列を返すため、どちらの変数も変更しません。

upper() で大文字と小文字を区別せずに文字列を比較する

同じように、組み込みの upper() メソッドも使えます。これは大文字に変換した新しい文字列を返すため、比較の前に両方の値へ upper() を適用します。lower() の代わりに使える方法です。両方の値に一貫して同じ正規化を適用してください。片方を小文字に、もう片方を大文字に変換するのではなく、各文字列に同じメソッドを使うことが重要です。

次の例では、同じ単語をそれぞれ大文字に変換して比較します。コード内の英語の例示文字列はそのまま表示されます。

first = "Hello World!"
second = "hello world!"

print(first.upper() == second.upper())
True

どちらの方法も、通常の大文字小文字の違いを比較するときに便利です。ただし、あらゆる Unicode の表記を同等にするわけではありません。Unicode に対応した大文字小文字を無視する照合が必要なら、casefold() を使いましょう。

casefold() で大文字小文字を区別せずに文字列を比較する

casefold() メソッドは、大文字小文字を区別しない照合のために設計されています。lower() による小文字変換よりも広い範囲の文字を変換できます。たとえば、lower() ではドイツ語の ß は変わりませんが、casefold() では ss に変換されます。そのため、"straße" と "STRASSE" はケースフォールディング後に等しくなります。ASCII の大文字小文字だけが異なるわけではない Unicode テキストを照合するときに役立ちます。

Unicode のケースフォールディングが必要な場合は、両方の値に casefold() を適用してから、返された文字列を == で比較します。次の実行例では、ß と ss の比較を示します。コード内の英語の例示文字列はそのまま表示されます。

first = "straße"
second = "STRASSE"

print(first.casefold() == second.casefold())
True

Unicode の大文字小文字を区別しない一般的な照合には casefold() を使いましょう。通常の大小文字変換で十分な単純なテキストなら、lower() または upper() を使うと意図が明確になります。これらのメソッドは比較用の値を正規化しますが、元の文字列を置き換えることはありません。