Сравнение строк в Python 3 - PullRequest
       40

Сравнение строк в Python 3

0 голосов
/ 30 апреля 2019

Сравнение строк не работает,

Есть идеи?

a = person.category[0].lower()
b = to_delete[5].lower()

print("test ", repr(a), "type: ", type(a))
print("test ", repr(b), "type: ", type(b))
print(a == b)
print(a is b)
print("éclairage public" == b)
print("éclairage public" == a )

возвращается:

test  'éclairage public' type:  <class 'str'>
test  'éclairage public' type:  <class 'str'>
False
False
False
True

Так что у "b" нет ожидаемого состава, но я не знаю почему!

1 Ответ

4 голосов
/ 30 апреля 2019

Ваша проблема почти наверняка состоит в том, что a и b - это два разных значения Unicode с одинаковой нормализацией . В качестве простого примера рассмотрим два способа отображения é:

>>> b'e\xcc\x81'.decode()
'é'
>>> b'\xc3\xa9'.decode()
'é'

Первая представляет собой двухсимвольную строку, состоящую из e (U + 0065) и объединяющей диакритической метки ´ (U + 0301). Второй - это один символ, состоящий из é (U + 00E9).

Чтобы успешно их сравнить, нужно их нормализовать. Доступно несколько различных нормализаций, хотя, какую вы используете, для сравнения не имеет большого значения, если вы используете одинаковую для каждой.

>>> import unicodedata
>>> x = b'e\xcc\x81'.decode()
>>> y = b'\xc3\xa9'.decode()
>>> x == y
False
>>> unicodedata.normalize("NFC", x) == unicodedata.normalize("NFC", y)
True

Нормализация NFC, например, нормализует путем замены U + 0065 / U + 0301 на U + 00E9. Для получения дополнительной информации см. https://www.unicode.org/faq/normalization.html. Возможно, вы захотите нормализовать любой пользовательский ввод перед его сохранением, и вам нужно убедиться, что для всех сохраненных данных используется одна и та же нормализация. FAQ может помочь вам решить, какая нормализация наиболее подходит для вашего использования.

...