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

发布于 2021-02-02 23:22:37

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

我想以一种非常简单且Pythonic的方式封装对常规字符串与存储库字符串的比较。我还希望能够使用常规python字符串在由字符串散列的字典中查找值。

关注者
0
被浏览
141
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    假设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)")
    


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    不区分大小写的方式比较字符串似乎很简单,但事实并非如此。我将使用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()帮助(但只能有所帮助)。

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

    "ê" == "ê"
    #>>> 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 unicodedata
    
    def normalize_caseless(text):
        return unicodedata.normalize("NFKD", text.casefold())
    
    def caseless_equal(left, right):
        return normalize_caseless(left) == normalize_caseless(right)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看