किसी मामले में असंवेदनशील तरीके से तार की तुलना तुच्छ लगती है, लेकिन ऐसा नहीं है। मैं पायथन 3 का उपयोग कर रहा हूं, क्योंकि पायथन 2 यहां अविकसित है।
ध्यान देने वाली पहली बात यह है कि यूनिकोड में केस हटाने वाले रूपांतरण तुच्छ नहीं हैं। जिसके लिए पाठ है text.lower() != text.upper().lower()
, जैसे "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
लेकिन मान लीजिए कि आप लापरवाही से तुलना करना चाहते हैं "BUSSE"
और "Buße"
। हेक, आप शायद तुलना "BUSSE"
और "BUẞE"
बराबर करना चाहते हैं - यह नया पूंजी रूप है। उपयोग करने के लिए अनुशंसित तरीका है casefold
:
str। केसफ़ॉल्ड ()
स्ट्रिंग की एक Casefolded प्रतिलिपि लौटाएँ। केसफॉल्ड स्ट्रिंग्स का उपयोग केसलेस मिलान के लिए किया जा सकता है।
Casefolding लोअरकेसिंग के समान है लेकिन अधिक आक्रामक है क्योंकि यह एक स्ट्रिंग में सभी मामले के अंतर को हटाने का इरादा है। [...]
सिर्फ उपयोग न करें lower
। यदि casefold
उपलब्ध नहीं है, तो .upper().lower()
मदद करना (लेकिन केवल कुछ हद तक)।
फिर आपको लहजे पर विचार करना चाहिए। यदि आपका फॉन्ट रेंडरर अच्छा है, तो आप शायद सोचते हैं "ê" == "ê"
- लेकिन यह नहीं है:
"ê" == "ê"
#>>> False
ऐसा इसलिए है क्योंकि उत्तरार्द्ध पर उच्चारण एक संयोजन चरित्र है।
import unicodedata
[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E WITH CIRCUMFLEX']
[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']
इससे निपटने का सबसे सरल तरीका है unicodedata.normalize
। आप शायद NFKD सामान्यीकरण का उपयोग करना चाहते हैं , लेकिन प्रलेखन की जांच करने के लिए स्वतंत्र महसूस करें। फिर एक करता है
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
समाप्त करने के लिए, यहाँ यह कार्य में व्यक्त किया गया है:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
औरΣΊΣΥΦΟΣ
फिर, आपका दृष्टिकोण विफल हो जाता है, क्योंकि वे एक ही मामले असंवेदनशील माना जाता है।