Dizeleri büyük / küçük harfe duyarlı olmayan bir şekilde karşılaştırmak önemsiz görünüyor, ama değil. Python 3 kullanacağım, çünkü Python 2 burada az gelişmiş.
Unutulmaması gereken ilk şey, Unicode'daki vaka kaldırma dönüşümlerinin önemsiz olmadığıdır. Metin var text.lower() != text.upper().lower()
gibi "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Ama diyelim ki dikkatsizce karşılaştırmak istediniz "BUSSE"
ve "Buße"
. Heck, muhtemelen karşılaştırmak "BUSSE"
ve "BUẞE"
eşitlemek istersiniz - bu daha yeni sermaye formudur. Önerilen yol aşağıdakileri kullanmaktır casefold
:
str. casefold ()
Dizenin büyük harfli bir kopyasını döndürür. Kazasız dizeler, kasasız eşleştirme için kullanılabilir.
Casefolding, küçük harflere benzer, ancak daha agresiftir, çünkü bir dizedeki tüm vaka ayrımlarını kaldırmayı amaçlamaktadır. [...]
Sadece kullanmayın lower
. Eğer casefold
, kullanılamaz yapıyor .upper().lower()
(ama sadece biraz) yardımcı olur.
O zaman aksanları düşünmelisiniz. Yazı tipi oluşturucunuz iyiyse, muhtemelen düşünürsünüz "ê" == "ê"
- ancak yapmaz:
"ê" == "ê"
#>>> False
Bunun nedeni, ikincisindeki aksanın birleştirici bir karakter olmasıdır.
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']
Bununla baş etmenin en basit yolu unicodedata.normalize
. Muhtemelen NFKD normalleştirmesini kullanmak istiyorsunuz , ancak belgeleri kontrol etmekten çekinmeyin. Sonra biri
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Tamamlamak için, burada bu fonksiyonlarda ifade edilir:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
ve iseΣΊΣΥΦΟΣ
, o zaman yaklaşımınız başarısız olur, çünkü bunların aynı durumun duyarsızca olması gerekiyordu.