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 )

返回:

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

所以"b"没有预期的组成,但我不知道为什么!

你的问题几乎可以肯定是ab是两个不同的 Unicode 值,具有相同的规范化。作为一个简单的示例,请考虑以下两种显示é的方式:

>>> b'exccx81'.decode()
'é'
>>> b'xc3xa9'.decode()
'é'

第一个是由e(U+0065) 和组合变音标记´(U+0301) 组成的双字符字符串。第二个是由é(U+00E9) 组成的单个字符。

为了成功比较它们,您需要对它们进行规范化。有几种不同的规范化可用,但您使用哪一种对于比较目的并不重要,只要您对每种规范化使用相同的规范化即可。

>>> import unicodedata
>>> x = b'exccx81'.decode()
>>> y = b'xc3xa9'.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。您可能希望在存储任何用户输入之前对其进行规范化,并且需要确保对所有存储的数据使用相同的规范化。常见问题解答可以帮助您确定哪种规范化最适合您的使用。

相关内容

  • 没有找到相关文章

最新更新