Подтвердить что ты не робот

Python: lower() vs. casefold() в сопоставлении строк и преобразование в нижний регистр

Как сделать сравнение строк без учета регистра?

Из того, что я понял из Google и ссылки выше, обе функции: lower() и casefold() преобразуют строку в нижний регистр, но casefold() преобразует даже безвизовые буквы, такие как ß на немецком языке в ss.

Все это о греческих письмах, но мой вопрос в целом:

  • есть ли другие отличия?
  • какой из них лучше преобразовать в нижний регистр?
  • какой лучше проверить соответствующие строки?

Часть 2:

firstString = "der Fluß"
secondString = "der Fluss"

# ß is equivalent to ss
if firstString.casefold() == secondString.casefold():
    print('The strings are equal.')
else:
    print('The strings are not equal.')

В приведенном выше примере следует использовать:

lower() # the result is not equal which make sense to me

Или:

casefold() # which ß is ss and result is the
        # strings are equal. (since I am a beginner that still does not
        # make sense to me. I see different strings).
4b9b3361

Ответ 1

Casefolding - более агрессивная версия lower() которая настроена на то, чтобы сделать многие из более уникальных символов юникода более сопоставимыми. Это еще одна форма нормализации текста, которая на первый взгляд может показаться сильно отличающейся, но она учитывает символы разных языков.

Я предлагаю вам поближе взглянуть на то, что на самом деле представляет собой сворачивание кейсов, так что вот хорошее начало: W3 Case Folding Wiki

Чтобы ответить на два других вопроса, если вы работаете строго на английском языке, lower() и casefold() должны давать точно такие же результаты. Однако, если вы пытаетесь нормализовать текст из других языков, которые используют больше, чем наш простой 26-буквенный алфавит (используя только ASCII), я бы использовал casefold() для сравнения ваших строк, поскольку это даст более согласованные результаты.

Другой источник: Elastic.co Case Folding

Изменение: я только недавно нашел другой очень хороший связанный ответ на немного другой вопрос здесь, на SO (сравнение строк без учета регистра)