Python 中的字符串比较 3
String comparison in Python 3
我的字符串比较不起作用,
有什么想法吗?
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 )
returns:
test 'éclairage public' type: <class 'str'>
test 'éclairage public' type: <class 'str'>
False
False
False
True
所以 "b" 没有预期的组成,但我不知道为什么!
你的问题几乎可以肯定 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。您可能希望在存储之前对任何用户输入进行规范化,并且您需要确保对所有存储的数据使用相同的规范化。常见问题解答可以帮助您确定最适合您使用的规范化。
我的字符串比较不起作用,
有什么想法吗?
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 )
returns:
test 'éclairage public' type: <class 'str'>
test 'éclairage public' type: <class 'str'>
False
False
False
True
所以 "b" 没有预期的组成,但我不知道为什么!
你的问题几乎可以肯定 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。您可能希望在存储之前对任何用户输入进行规范化,并且您需要确保对所有存储的数据使用相同的规范化。常见问题解答可以帮助您确定最适合您使用的规范化。