Der Vergleich von Zeichenfolgen auf eine Weise, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, scheint trivial zu sein, ist es aber nicht. Ich werde Python 3 verwenden, da Python 2 hier unterentwickelt ist.
Das erste, was zu beachten ist, ist, dass das Entfernen von Groß- und Kleinschreibung in Unicode nicht trivial ist. Es gibt Text, für den text.lower() != text.upper().lower()wie "ß":
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Aber lassen Sie uns sagen , Sie zu caselessly vergleichen wollte "BUSSE"und "Buße". Heck, Sie möchten wahrscheinlich auch vergleichen "BUSSE"und "BUẞE"gleich - das ist die neuere Kapitalform. Der empfohlene Weg ist casefold:
str. casefold ()
Geben Sie eine casefolded Kopie der Zeichenfolge zurück. Casefolded Strings können für das Matching ohne Gehäuse verwendet werden.
Casefolding ähnelt dem Lowercasing, ist jedoch aggressiver, da alle Case-Unterscheidungen in einer Zeichenfolge entfernt werden sollen. [...]
Nicht nur verwenden lower. Wenn casefoldnicht verfügbar, .upper().lower()hilft das Tun (aber nur etwas).
Dann sollten Sie Akzente berücksichtigen. Wenn Ihr Font-Renderer gut ist, denken Sie wahrscheinlich "ê" == "ê"- aber nicht:
"ê" == "ê"
#>>> False
Dies liegt daran, dass der Akzent auf letzterem ein kombinierender Charakter ist.
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']
Der einfachste Weg, damit umzugehen, ist unicodedata.normalize. Sie möchten wahrscheinlich die NFKD- Normalisierung verwenden , können jedoch die Dokumentation überprüfen. Dann tut man es
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Zum Schluss wird dies hier in Funktionen ausgedrückt:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφοςund sindΣΊΣΥΦΟΣ, schlägt Ihr Ansatz fehl, da diese unempfindlich der gleiche Fall sein sollen.