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 casefold
nicht 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.