সংবেদনশীল উপায়ে স্ট্রিংগুলির তুলনা তুচ্ছ মনে হয়, তবে তা হয় না। আমি পাইথন 3 ব্যবহার করব, যেহেতু পাইথন 2 এখানে অনুন্নত রয়েছে।
প্রথম যে বিষয়টি লক্ষ্যণীয় তা হ'ল ইউনিকোডে কেস-অপসারণ রূপান্তরগুলি তুচ্ছ নয়। এর জন্য পাঠ্য রয়েছে text.lower() != text.upper().lower()
যেমন "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
তবে ধরা যাক আপনি নির্বিশেষে তুলনা করতে চেয়েছিলেন "BUSSE"
এবং "Buße"
। হেক, আপনি সম্ভবত তুলনা করতে "BUSSE"
এবং "BUẞE"
সমান করতে চান - এটি নতুন মূলধন ফর্ম। প্রস্তাবিত উপায়টি হ'ল casefold
:
Str। কেসফোল্ড ()
স্ট্রিংয়ের কেসফোল্ডড কপিটি ফিরিয়ে দিন। কেসফোল্ডড স্ট্রিংগুলি কেসলেস ম্যাচের জন্য ব্যবহার করা যেতে পারে।
কেসফোল্ডিং হ্রাস করা সমান তবে আরও আক্রমণাত্মক কারণ এটি স্ট্রিংয়ের ক্ষেত্রে সমস্ত ক্ষেত্রে পার্থক্যগুলি সরিয়ে ফেলার উদ্দেশ্যে is [...]
শুধু ব্যবহার করবেন না 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)
Σίσυφος
এবংΣΊΣΥΦΟΣ
তবে আপনার পন্থাটি ব্যর্থ হয়, কারণ সেগুলি সংবেদনশীলভাবে একই ক্ষেত্রে বলে মনে করা হয়।