Python中不区分大小写的字符串比较

将两个字符串都转换为小写以执行不区分大小写的字符串比较,例如 if string1.lower() == string2.lower():。 通过将两个字符串转换为相同的大小写,我们执行不区分大小写的比较。

string1 = 'Zadmei'
string2 = 'ZADMEI'

# ✅ using str.lower()

if string1.lower() == string2.lower():
    # 👇️ this runs
    print('The strings are equal when case is ignored ✅')
else:
    print('The strings are NOT equal when case is ignored ✅')

# ------------------------------------------------------------

# ✅ using str.casefold()

if string1.casefold() == string2.casefold():
    # 👇️ this runs
    print('The strings are equal when case is ignored ✅')
else:
    print('The strings are NOT equal when case is ignored ✅')

Python中不区分大小写的字符串比较

第一个示例使用 str.lower() 方法执行不区分大小写的字符串比较。

str.lower() 方法返回字符串的副本,其中所有大小写字符都转换为小写。

string1 = 'Zadmei'
string2 = 'ZADMEI'

if string1.lower() == string2.lower():
    # 👇️ this runs
    print('The strings are equal when case is ignored ✅')
else:
    print('The strings are NOT equal when case is ignored ✅')

该方法不会更改原始字符串,而是返回一个新字符串。 字符串在 Python 中是不可变的。

str.lower() 方法最适合在比较 ASCII 字符串时忽略大小写。

对于非 ASCII 字符串,使用 str.casefold() 方法。


使用 str.casefold() 进行不区分大小写的字符串比较

使用 str.casefold() 方法执行不区分大小写的字符串比较,例如 if string1.casefold() == string2.casefold():。 str.casefold() 方法删除字符串中的所有大小写区别。

string1 = 'Zadmei'
string2 = 'ZADMEI'


if string1.casefold() == string2.casefold():
    # 👇️ this runs
    print('The strings are equal when case is ignored ✅')
else:
    print('The strings are NOT equal when case is ignored ✅')

str.casefold() 方法返回字符串的大小写副本。

# 👇️ using str.casefold()
print('ZADMEI'.casefold())  # 👉️ zadmei
print('ß'.casefold())  # 👉️ ss

# 👇️ using str.lower()
print('ZADMEI'.lower())  # 👉️ zadmei
print('ß'.lower())  # 👉️ ß

大小写折叠类似于小写,但更具侵略性,因为它旨在删除字符串中的所有大小写区别。

如果我们只比较 ASCII 字符串,则不需要使用 str.casefold() 方法。 在这种情况下,使用 str.lower() 就足够了。


使用 unicodedata.normalize() 进行不区分大小写的字符串比较

使用 unicodedata.normalize() 方法执行不区分大小写的字符串比较。 unicodedata.noramlize() 方法将返回字符串的正常形式,因此带重音的等效字符被认为是相等的。

import unicodedata

def caseless_compare(str1, str2):
    return (unicodedata.normalize('NFKD', str1) ==
            unicodedata.normalize('NFKD', str2))


string1 = 'dž'
string2 = 'dž'

print(string1 == string2)  # 👉️ False
print(string1.lower() == string2.lower())  # 👉️ False
print(string1.casefold() == string2.casefold())  # 👉️ False

print(caseless_compare(string1, string2))  # 👉️ True

我们正在比较的字符串包含重音符号。 它们代表相同的字符(或字符序列),但具有不同的视觉外观。

unicodedata.normalize() 方法返回提供的 Unicode 字符串的正常形式。

我们对示例中的两个字符串进行了规范化,以执行不区分大小写的字符串比较。

仅当我们的字符串可能包含不一致的重音字符时,才需要这种方法。

我们应该选择哪种方法取决于您的用例。

如果我们只使用 ASCII 字符串,则使用 str.lower() 方法就足够了。