テキストを統一ケースに変換することは、テキスト処理のあらゆるタイプの出発点として良いことです。
この記事では、文字列を操作するために使用される Python の組み込みメソッドの 1 つである str.lower()
を使用して、テキストを小文字に変換する方法を紹介します。
トップレベルのビューでは、この処理は以下のように行われます。
exampleString = "AbCdF_1@3$"
lowercaseString = exampleString.lower()
print(lowercaseString) # abcdef_1@3$
しかし、特にあなたがPythonに慣れていないのであれば、この先を読み進めてください。この記事では、文字列を小文字に変換するための別のアプローチについて説明し、このテーマの全体像を把握できるようにします。この記事を読めば、どんな文字列でも小文字に変換できるようになり、いつ str.lower()
メソッドを使うべきか、そしていつ別の方法を選ぶべきかがわかるようになるでしょう。
Pythonで文字列を小文字に変換する方法
Pythonでは文字列を小文字に変換するのはとても簡単です。str.lower()はそのために作られたビルトインメソッドです。これは、Pythonの名前空間に組み込まれている
String` 型のメソッドとして定義されています。
注意:Pythonの組み込み型には、その特定の型に対して操作を行うためのメソッドが用意されています。例えば、 String
型は、先頭と末尾の空白文字を削除したり、部分文字列を見つけて置き換えたり、文字列を配列に分割したりするための定義済みのメソッドを持っています。それらのメソッドの1つが str.lower()
です。
String型に定義されたすべてのメソッドは、ドキュメントではその名前の前に
str` という接頭辞が付いています。これは、これらのメソッドがすべて文字列のインスタンスに対して呼び出されることを示唆しています。
str.lower()` メソッドは、呼び出された文字列を小文字に変換して返します。これは、後で使うために元の文字列を保存しておきたい場合に便利です。では、Pythonで文字列を小文字に変換する方法を見てみましょう。
変換したい文字列があるとします。
exampleString = "AbCdF_1@3$"
見ての通り、この文字列には小文字と大文字の両方があり、さらにいくつかの特殊文字も含まれています。小文字に変換できるのは文字だけなので、この文字列の小文字版は "abcdef_1@3$"
となることが予想されます。
lowercaseString = exampleString.lower()
print(lowercaseString) # abcdef_1@3$
str.lower()メソッドを
exampleStringに対して呼び出した後、その小文字のコピーは新しいオブジェクトとして格納され、
lowercaseStringから参照されるようになります。str.lower()
メソッドが正しい出力を生成することを確認するために、 lowercaseString
を exampleString
の小文字バージョンと比較してみましょう。
if(lowercaseString == "abcdef_1@3$"):
print("Lowercase string EQUAL to expected string!")
else:
print("Lowercase string NOT EQUAL to expected string!")
このコード片は次のように出力されます。
"Lowercase string EQUAL to expected string!"
すごい!
注意: str.lower()
メソッドの反対側にあるのが str.upper()
メソッドです。これは str.lower()
と同じように使用します。また、文字列がすべて小文字かすべて大文字かは str.islower()
または str.isupper()
を使って確認することができます。
str.lower()の代わりにstr.casefold()を使う理由
先ほどの方法は、ほとんどのケースに適しています。これは、いくつかの簡単なルールに従って、想定されることを実行します。Python 3.0から、文字列はUnicode文字の配列として表現されます。そのため、 str.lower()
は大文字のコードを対応する小文字のコードに置き換えることが簡単にできるようになりました。
この原理はほとんどすべてのユースケースでうまく機能しますが、代わりに str.casefold()
メソッドを使うことを検討すべき例もあります。
例えば、2つの文字列のケースレスマッチングを実装する場合、 str.casefold()
を使うのがよいでしょう。Pythonは文字列を表現するのにUnicodeを使用しているので、Unicode Standardで定義されているすべてのルールがPythonにも適用されます。セクション3.13でStandardは次のように記述しています。
文字列 X
は文字列 Y
に対してケースレスマッチであるのは、以下の場合のみである。
> toCasefold(X) = toCasefold(Y)
>
>
str.casefold()は Unicode のメソッド
toCasefold()` の Python 実装なので、ケースレスマッチングを実装する場合はこれを使う必要があります。
注: X.casefold()
と toCasefold(X)
メソッドはどちらも文字列 X
の各文字を、Unicode Character Database の CaseFolding.txt
ファイルで定義されているように大文字に対応させるものである。
str.lower()と
str.casefold()` の違いを説明するために、ドイツ語の文字 “ß” を例にとって見てみましょう。小文字は “ss” と同じ意味です。つまり、次のような文字列がケースレスの完全一致になるはずです。
A = "ßaBcß"
B = "ssAbCss"
しかし、str.lower()
メソッドを使ってこれらを比較しようとすると、期待通りの結果は得られません。
Al = A.lower()
Bl = B.lower()
print(Al == Bl)
# Output: False
これは、A.lower()
はB.lower()
と等しくないという意味です。これは、”ß” は既に小文字なので、 str.lower()
メソッドでは変更されないからです。したがって、Al
と Bl
は次のような値になります。
Al = "ßabcß"
Bl = "ssabcss"
明らかに、Al
は Bl
と等しくないので、先ほどの比較は False
という値を生成しなければなりません。
この予期せぬ動作を修正するには、 str.casefold()
メソッドを使用する必要があります。これは str.lower()
と比べてより積極的です。なぜなら、文字列中の文字ケーシングの違いを完全に除去してしまうからです。したがって、”ß” は “ss” に置き換えられ、文字列 A
と B
をケースレスでマッチさせることができる。
Ac = A.casefold()
# Ac = "ssabcss"
Bc = B.casefold()
# Bc = "ssabcss"
さて、大文字小文字を区別した文字列 A
と B
を比較すると、Unicode Standard で定義されているのと同じ、期待通りの結果が得られます。
print(Ac == Bc)
# Output: True
警告: このタイプのケースレス マッチングは、デフォルトのケースレス マッチングと呼ばれ、Unicode 標準で定義されているケースレス マッチングの最も基本的なタイプです。
Unicode Standard で定義されているケースレス マッチングには、さらに 3 つのタイプ、canonical、compatibility、identifier のケースレス マッチングがあります。これらのタイプはそれぞれ、より特定のユースケースにおけるマッチングの正確さを向上させるために、1つまたは複数のステップが追加されることを意味します。これらの追加ステップは通常、マッチング中の文字列の正規化で構成されます (これは、デフォルトのケースレス・マッチングでは実行されません)。
結論
このガイドを読めば、Pythonで文字列を小文字に変換する最も一般的な方法は何か、また別の方法は何かを理解できるはずです。
Pythonの str.lower()
メソッドについて簡単に説明した後、 str.casefold()
メソッドの詳細に飛び込みました。
その基本的な使用例をカバーし、 str.lower()
メソッドと比較し、ケースフォールドアルゴリズムのPython実装を取り巻く基本概念と標準を説明しました。
最後に、str.casefold()
メソッドが生み出す望ましくない結果に注意できるように、問題となるユースケースをいくつか取り上げました。