Membandingkan string dengan case case peka tampaknya sepele, tapi tidak. Saya akan menggunakan Python 3, karena Python 2 kurang dikembangkan di sini.
Hal pertama yang perlu diperhatikan adalah konversi penghapusan case di Unicode tidak sepele. Ada teks untuk itu text.lower() != text.upper().lower()
, seperti "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Tapi katakanlah Anda ingin membandingkan "BUSSE"
dan "Buße"
. Heck, Anda mungkin juga ingin membandingkan "BUSSE"
dan "BUẞE"
menyamakan - itulah bentuk modal yang lebih baru. Cara yang disarankan adalah menggunakan casefold
:
str. casefold ()
Kembalikan salinan string yang dilipat case. String casefolded dapat digunakan untuk pencocokan caseless.
Casefolding mirip dengan huruf kecil tetapi lebih agresif karena dimaksudkan untuk menghapus semua perbedaan huruf dalam string. [...]
Jangan hanya digunakan lower
. Jika casefold
tidak tersedia, melakukan .upper().lower()
bantuan (tetapi hanya sedikit).
Maka Anda harus mempertimbangkan aksen. Jika font renderer Anda bagus, Anda mungkin berpikir "ê" == "ê"
- tetapi itu tidak:
"ê" == "ê"
#>>> False
Ini karena aksen pada yang terakhir adalah karakter yang menggabungkan.
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']
Cara paling sederhana untuk mengatasinya adalah unicodedata.normalize
. Anda mungkin ingin menggunakan normalisasi NFKD , tetapi jangan ragu untuk memeriksa dokumentasinya. Lalu seseorang melakukannya
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Untuk menyelesaikan, di sini ini dinyatakan dalam fungsi:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
danΣΊΣΥΦΟΣ
, maka pendekatan Anda gagal, karena mereka seharusnya menjadi kasus yang sama tidak sensitif.