2016-10-31 3 views
3

大文字と小文字を区別しない場合、casefoldと文字列の比較を最近読んでいます。私は、MSDN標準がInvariantCultureを使用し、確実にtoLowercaseを避けることであることを読んだ。しかし、私が読んだことからcasefoldはより積極的なものになっています。私の質問は、私はPythonでcasefoldを使うべきですか、代わりに使うためにもっとpythonic標準がありますか?また、casefoldはトルコテストに合格しますか?Python casefoldを使うべきですか?

+2

1. casefoldが何をしているのかが[docs](https://docs.python.org/3/library/stdtypes.html#str.casefold)で説明されています。 2.この場合、「より良い」*という意味は何ですか? 3.トルコのテストは何ですか(そしてあなたはそれを見つけようとしましたか?) – jonrsharpe

+0

@jonrsharpe申し訳ありませんが、より多くのpythonicと意味トルコのテストを意味します。私はちょうどいいプログラマーがPythonでカスレードな比較をしたいときに使うものを知りたがっています。 – FlyingLightning

+0

@jonrsharpe - トルコのテストはここで詳しく説明しています。http://stackoverflow.com/a/797043/135978 –

答えて

4

1)Python 3では、大文字と小文字を区別しない文字列マッチングを実装するためにcasefold()を使用する必要があります。

Python 3.0以降、文字列はUnicodeとして格納されます。 The Unicode Standard Chapter 3.13が次のようにに一致デフォルトケースレスを定義:
toCasefold(X)= toCasefold(Y)

文字列Xは、場合にのみ、文字列Y用ケースレスの一致でありますPython's casefold() implements the Unicode's toCasefold().これは、caseless文字列マッチングの実装に使用する必要があります。しかし、ケースフォールディングだけでは、コーナーケースをカバーしたり、トルコテストに合格するには不十分です(ポイント3を参照)。

2)Python 3.6以降、casefold()はTurkey Testに合格できません。 2つの文字については

、大文字のIと点線の大文字のIは、the Unicode Standard defines two different casefolding mappings.

(非チュルク語族のための)デフォルト:
私は(U + 0049→U + 0069)→
İ →I(U + 0130→U + 0069 U + 0307)

(テュルク系言語用の)代替:
私は(U + 0049→U + 0131)→
Pythons casefold()は、デフォルトマッピングのみを適用することができ、トルコテストに失敗します。たとえば、トルコ語の「LIMAI」と「limanı」は同等の意味を持ちませんが、"LİMANI".casefold() == "limanı".casefold()Falseを返します。代替マッピングを有効にするオプションはありません。

The Unicode Standard Chapter 3.13のPython 3のケースレス文字列マッチングを行う方法

3)は、いくつかのケースレスのマッチングアルゴリズムを記述しています。 正規のcasless照合はおそらくほとんどの使用例に適合します。このアルゴリズムは、すべてのコーナーケースを考慮しています。非トルコ語とトルコ語の間で切り替えるオプションを追加するだけです。

import unicodedata 

def normalize_NFD(string): 
    return unicodedata.normalize('NFD', string) 

def casefold_(string, include_special_i=False): 
    if include_special_i: 
     string = unicodedata.normalize('NFC', string) 
     string = string.replace('\u0049', '\u0131') 
     string = string.replace('\u0130', '\u0069') 
    return string.casefold() 

def casefold_NFD(string, include_special_i=False): 
    return normalize_NFD(casefold_(normalize_NFD(string), include_special_i)) 

def caseless_match(string1, string2, include_special_i=False): 
    return casefold_NFD(string1, include_special_i) == casefold_NFD(string2, include_special_i) 

casefold_()はPythonのcasefold()のラッパーです。パラメータinclude_special_iTrueに設定されている場合はTurkicマッピングが適用され、Falseに設定されている場合はデフォルトマッピングが使用されます。

caseless_match()string1string2の標準的な小文字の一致がありますか。文字列がトルコ語の場合は、パラメータをTrueに設定する必要があります。

例:

caseless_match('LİMANI', 'limanı', include_special_i=True)

caseless_match('LİMANI', 'limanı')

caseless_match('INTENSIVE', 'intensive', include_special_i=True)

caseless_match('INTENSIVE', 'intensive')

関連する問題