文字列のマッチングと小文字への変換におけるlower()とcasefold()の比較 質問する

文字列のマッチングと小文字への変換におけるlower()とcasefold()の比較 質問する

大文字と小文字を区別しない文字列比較を行うにはどうすればいいですか?

Google と上記のリンクから私が理解したところによると、 と の両方の関数lower()casefold()文字列を小文字に変換しますが、ドイツ語のcasefold()などの大文字と小文字を区別しない文字も に変換します。ßss

これらはすべてギリシャ文字に関することですが、私の一般的な質問は次のとおりです。

  • 他に違いはありますか?
  • 小文字に変換するにはどちらが良いでしょうか?
  • 一致する文字列をチェックするにはどちらが良いでしょうか?

パート2:

firstString = "der Fluß"
secondString = "der Fluss"

# ß is equivalent to ss
if firstString.casefold() == secondString.casefold():
    print('The strings are equal.')
else:
    print('The strings are not equal.')

上記の例では、以下を使用する必要があります。

lower() # the result is not equal which make sense to me

または:

casefold() # which ß is ss and result is the
        # strings are equal. (since I am a beginner that still does not
        # make sense to me. I see different strings).

ベストアンサー1

要約

  • 小文字に変換 ->lower()
  • 大文字と小文字を区別しない文字列のマッチング/比較 ->casefold()

casefold()は、比較の目的で大文字と小文字の区別を削除するように特別に設計された、のようなテキスト正規化関数ですlower()。 これは、結果が一般的に同じであるため、一見 lower() と非常によく似ているように見えるテキスト正規化の別の形式です。 Unicode 13.0.0 の時点では、lower()とを通過したときに異なる結果を生成する文字は約 150,000 文字のうち約 300 文字のみでしたcasefold()@dlukes の回答異なる結果を生成する文字を識別するコードがあります。

他の 2 つの質問にお答えします。

  • lower()ユーザーに提示したり、データを永続化したりする場合など、文字が小文字であることを特に確認したい場合に使用します。
  • casefold()その結果を別の -ed 値と比較する場合に使用しますcasefold

その他の資料

ケース フォールディングが実際にどのようなものか、詳しく調べてみることをお勧めします。まずは、次の点を確認してください。W3 ケース折りたたみ Wiki

別の情報源:Elastic.co ケース折りたたみ

編集:最近また良いものを見つけました少し異なる質問に対する関連する回答SO では(大文字と小文字を区別しない文字列比較を行っています)


パフォーマンス

このスニペットを使用すると、2 つの間のパフォーマンスを把握できます。

import sys
from timeit import timeit

unicode_codepoints = tuple(map(chr, range(sys.maxunicode)))

def compute_lower():
    return tuple(codepoint.lower() for codepoint in unicode_codepoints)

def compute_casefold():
    return tuple(codepoint.casefold() for codepoint in unicode_codepoints)

timer_repeat = 1000

print(f"time to compute lower on unicode namespace: {timeit(compute_lower, number = timer_repeat) / timer_repeat} seconds")
print(f"time to compute casefold on unicode namespace: {timeit(compute_casefold, number = timer_repeat) / timer_repeat} seconds")

print(f"number of distinct characters from lower: {len(set(compute_lower()))}")
print(f"number of distinct characters from casefold: {len(set(compute_casefold()))}")

これを実行すると、パフォーマンスと返される異なる文字の数の両方で2つが圧倒的に同じである結果が得られます。

time to compute lower on unicode namespace: 0.137255663 seconds
time to compute casefold on unicode namespace: 0.136321374 seconds
number of distinct characters from lower: 1112719
number of distinct characters from casefold: 1112694

数値を実行すると、どちらの関数でも 1 つの文字の計算を実行するのに約 1.6e-07 秒かかるため、どちらの方法でもパフォーマンス上の利点はありません。

おすすめ記事