用一种不区分大小写的方式比较字符串似乎是微不足道的事情,但事实并非如此。我将使用Python 3,因为Python 2在这里是不发达的。
首先要注意的是,Unicode中移除大小写的转换并不简单。有一些文本text.lower() != text.upper().lower(),如"ß":"ß".lower()#>>> 'ß'"ß".upper().lower()#>>> 'ss'
但假设你想把"BUSSE"和"Buße"..见鬼,你也许也想比较一下"BUSSE"和"BUẞE"相等-这是较新的大写形式。推荐的方法是使用casefold:help(str.casefold)#>>> Help on method_descriptor:#>>>#>>> casefold(...)#>>> S.casefold() -> str#>>>
#>>> Return a version of S suitable for caseless comparisons.#>>>
不要仅仅使用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 unicodedatadef normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)