您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python-如何进行不区分大小写的字符串比较?

Python-如何进行不区分大小写的字符串比较?

假设ASCII字符串:

string1 = 'Hello'
string2 = 'hello'

if string1.lower() == string2.lower():
    print("The strings are the same (case insensitive)")
else:
    print("The strings are NOT the same (case insensitive)")

不区分大小写的方式比较字符串似乎很简单,但事实并非如此。我将使用Python 3,因为Python 2在这里尚未开发。

首先要注意的是,用Unicode删除大小写的转换并非易事。其中有一些文字text.lower() != text.upper().lower(),例如"ß"

"ß".lower()
#>>> 'ß'

"ß".upper().lower()
#>>> 'ss'

但是,假设你想无休止地比较”BUSSE”和”Buße”。哎呀,你可能还想比较”BUSSE”和”BU?E”相等-这是较新的资本形式。推荐的方法是使用casefold:

海峡 折叠()

返回字符串的casefolded副本。大小写折叠的字符串可用于无大小写的匹配。

大小写折叠类似于小写字母,但是更具攻击性,因为它旨在删除字符串中的所有大小写区别。[...]

不要只是使用lower。如果casefold不可用,则可以提供.upper().lower()帮助(但只能有所帮助)。

然后,你应该考虑口音。如果你的字体渲染器不错,你可能会想"ê" == "e?"-但事实并非如此:

"ê" == "e?"
#>>> False

这是因为后者的重音是组合字符。

import unicodedata

[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E WITH CIRCUMFLEX']

[unicodedata.name(char) for char in "e?"]
#>>> ['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']

解决此问题的最简单方法是unicodedata.normalize。你可能想使用NFKD规范化,但请随时检查文档。然后一个

unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "e?")
#>>> True

最后,这用函数表示:

import unicodedata

def normalize_caseless(text):
    return unicodedata.normalize("NFKD", text.casefold())

def caseless_equal(left, right):
    return normalize_caseless(left) == normalize_caseless(right)
python 2022/1/1 18:24:47 有177人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶