大文字と小文字を区別しない場合、casefoldと文字列の比較を最近読んでいます。私は、MSDN標準がInvariantCultureを使用し、確実にtoLowercaseを避けることであることを読んだ。しかし、私が読んだことからcasefoldはより積極的なものになっています。私の質問は、私はPythonでcasefoldを使うべきですか、代わりに使うためにもっとpythonic標準がありますか?また、casefoldはトルコテストに合格しますか?Python casefoldを使うべきですか?
答えて
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'stoCasefold()
.これは、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)→
Pythonscasefold()
は、デフォルトマッピングのみを適用することができ、トルコテストに失敗します。たとえば、トルコ語の「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_i
がTrue
に設定されている場合はTurkicマッピングが適用され、False
に設定されている場合はデフォルトマッピングが使用されます。
caseless_match()
string1
とstring2
の標準的な小文字の一致がありますか。文字列がトルコ語の場合は、パラメータを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')
真
- 1. display:blockを使うべきか、display:flexを使うべきですか?
- 2. Python 3.xでは\ nをいつ使うべきですか?
- 3. Pythonで「ラクダケース」やアンダースコアを使うべきですか?
- 4. Pythonではいつsplit()を使うべきですか?
- 5. 私はクラスを使うべきですか? (Python)
- 6. VBAの代わりにPythonを使うべきですか?
- 7. setUpClassはいつ使うべきですか?__init__を使うべきですか?
- 8. Jira Agileでは "Story"をいつ使うべきか "Improvement"を使うべきか
- 9. Pythonでは、これにスレッドを使うべきでしょうか?
- 10. jQuery.each()を使うべきですか?
- 11. Pythonでは、ifブロックでのリターン後にelseを使うべきですか?
- 12. @classmethodはいつ使うべきですか?defメソッド(self)を使うべきですか?
- 13. Pythonスクリプトを改善するためにスレッディングを使うべきですか?
- 14. C#では、いつ構造体を使うべきですか?クラスはいつ使うべきですか?
- 15. MySQLデータベースの挿入プログラムにPythonクラスを使うべきですか?
- 16. Python:いつos.popenの代わりにsubprocess.Popenを使うべきですか?
- 17. C#リストはいつ使うべきですか?そして、いつarraylistを使うべきですか?
- 18. マルチスレッドと比べてselectをいつ使うべきですか?
- 19. LuceneまたはPyLuceneでJythonを使うべきですか?
- 20. オープンソースライブラリをWindowsでどのように使うべきですか?
- 21. C#でWMPEqualizerSettingsCtrlClassをどのように使うべきですか?
- 22. facebook appの質問:どのdoctypeを使うべきか、XFBMLやiframeを使うべきですか?
- 23. mixinsは親属性を使うべきですか?
- 24. NumPy/SciPyを使いたいです。私はPython 2または3を使うべきですか?
- 25. スレッドやプロセスはどちらを使うべきですか?
- 26. チックタイムを保つために、私はPythonゲームサーバーでどのような方法を使うべきですか?
- 27. Pythonで+ = meanとは何ですか?なぜ私はそれを使うべきですか?
- 28. "if"を使ってエラーをチェックするべきときと、例外をいつ使うべきですか?
- 29. virtualenvとは何ですか、なぜそれを使うべきですか?
- 30. プラグインを書くか、関数を使うべきですか?
1. casefoldが何をしているのかが[docs](https://docs.python.org/3/library/stdtypes.html#str.casefold)で説明されています。 2.この場合、「より良い」*という意味は何ですか? 3.トルコのテストは何ですか(そしてあなたはそれを見つけようとしましたか?) – jonrsharpe
@jonrsharpe申し訳ありませんが、より多くのpythonicと意味トルコのテストを意味します。私はちょうどいいプログラマーがPythonでカスレードな比較をしたいときに使うものを知りたがっています。 – FlyingLightning
@jonrsharpe - トルコのテストはここで詳しく説明しています。http://stackoverflow.com/a/797043/135978 –