Сравнение строк без учета регистра кажется тривиальным, но это не так. Я буду использовать Python 3, так как Python 2 здесь недостаточно развит.
Первое, на что нужно обратить внимание, - это то, что преобразования с удалением регистра в Unicode не являются тривиальными. Есть текст, для которого text.lower() != text.upper().lower()
, например "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Но, допустим, вы хотели безошибочно сравнить "BUSSE"
и "Buße"
. Черт возьми, вы, вероятно, тоже хотите сравнить "BUSSE"
и сравнить "BUẞE"
- это более новая форма капитала. Рекомендуемый способ заключается в использовании casefold
:
ул. casefold ()
Вернуть регистр свернутой копии строки. Строки в регистре могут быть использованы для сопоставления без регистра.
Свертывание регистров похоже на нижний регистр, но более агрессивно, потому что оно предназначено для удаления всех различий регистра в строке. [...]
Не просто использовать lower
. Если casefold
нет в наличии, делаю.upper().lower()
помогает (но только в некоторой степени).
Тогда вы должны рассмотреть акценты. Если ваш рендерер шрифтов хорош, вы, вероятно, думаете, "ê" == "ê"
но это не так:
"ê" == "ê"
#>>> False
Это потому, что акцент на последнем является сочетанием характера.
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']
Самый простой способ справиться с этим unicodedata.normalize
. Вы, вероятно, хотите использовать нормализацию NFKD , но не стесняйтесь проверять документацию. Тогда один
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Чтобы закончить, здесь это выражается в функциях:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
иΣΊΣΥΦΟΣ
, тогда ваш подход потерпит неудачу, потому что они должны быть одинаковыми без учета регистра.