Der Vergleich von Zeichenketten ohne Berücksichtigung der Groß- und Kleinschreibung scheint trivial, ist es aber nicht. Ich werde Python 3 verwenden, da Python 2 hier unterentwickelt ist.
Zunächst einmal ist zu beachten, dass die Umwandlung von Groß- und Kleinschreibung in Unicode nicht trivial ist. Es gibt Text, für den text.lower() != text.upper().lower()
, wie zum Beispiel "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Aber nehmen wir mal an, Sie wollten falllos vergleichen "BUSSE"
y "Buße"
. Wahrscheinlich wollen Sie auch vergleichen "BUSSE"
y "BUE"
gleich - das ist die neuere Großbuchstabenform. Der empfohlene Weg ist die Verwendung von casefold
:
str. Fallfalte ()
Gibt eine gefaltete Kopie der Zeichenkette zurück. Gefaltete Zeichenketten können verwendet werden für falllosen Abgleich verwendet werden.
Die Groß-/Kleinschreibung ist ähnlich wie die Kleinschreibung, aber aggressiver, da sie alle Unterscheidungen zwischen Groß- und Kleinschreibung in einer Zeichenkette aufheben soll. [...]
Verwenden Sie nicht nur lower
. Si casefold
nicht verfügbar ist, wird .upper().lower()
hilft (aber nur ein wenig).
Dann sollten Sie über Akzente nachdenken. Wenn Ihr Schrift-Renderer gut ist, denken Sie wahrscheinlich "ê" == "e"
- aber das tut sie nicht:
"ê" == "e"
#>>> False
Der Grund dafür ist, dass der Akzent bei letzterem ein kombinierendes Zeichen ist.
import unicodedata
[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E WITH CIRCUMFLEX']
[unicodedata.name(char) for char in "e"]
#>>> ['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']
Der einfachste Weg, damit umzugehen, ist unicodedata.normalize
. Sie möchten wahrscheinlich NFKD Normalisierung aber sehen Sie sich ruhig die Dokumentation an. Dann tut man
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "e")
#>>> True
Abschließend sei gesagt, dass dies in Funktionen ausgedrückt wird:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)