如何在Python中以不区分大小写的方式比较字符串?
我想使用简单的python代码将常规字符串的比较封装到存储库字符串中。我也想有能力在字典中查找值哈希字符串使用常规的python字符串。
如何在Python中以不区分大小写的方式比较字符串?
我想使用简单的python代码将常规字符串的比较封装到存储库字符串中。我也想有能力在字典中查找值哈希字符串使用常规的python字符串。
当前回答
您可以使用casefold()方法。casefold()方法在比较时忽略案例。
firstString = "Hi EVERYONE"
secondString = "Hi everyone"
if firstString.casefold() == secondString.casefold():
print('The strings are equal.')
else:
print('The strings are not equal.')
输出:
The strings are equal.
其他回答
您可以使用casefold()方法。casefold()方法在比较时忽略案例。
firstString = "Hi EVERYONE"
secondString = "Hi everyone"
if firstString.casefold() == secondString.casefold():
print('The strings are equal.')
else:
print('The strings are not equal.')
输出:
The strings are equal.
考虑使用jaraco.text中的FoldedCase:
>>> from jaraco.text import FoldedCase
>>> FoldedCase('Hello World') in ['hello world']
True
如果你想要一个不考虑大小写的字典,使用来自jaraco.collections的FoldedCaseKeyedDict:
>>> from jaraco.collections import FoldedCaseKeyedDict
>>> d = FoldedCaseKeyedDict()
>>> d['heLlo'] = 'world'
>>> list(d.keys()) == ['heLlo']
True
>>> d['hello'] == 'world'
True
>>> 'hello' in d
True
>>> 'HELLO' in d
True
我看到这个用正则表达式的解。
import re
if re.search('mandy', 'Mandy Pande', re.IGNORECASE):
# is True
它和口音很搭
In [42]: if re.search("ê","ê", re.IGNORECASE):
....: print(1)
....:
1
但是,它不适用于unicode字符不区分大小写的情况。谢谢@Rhymoid指出,我的理解是,它需要确切的符号,因为情况是真实的。回显如下:
In [36]: "ß".lower()
Out[36]: 'ß'
In [37]: "ß".upper()
Out[37]: 'SS'
In [38]: "ß".upper().lower()
Out[38]: 'ss'
In [39]: if re.search("ß","ßß", re.IGNORECASE):
....: print(1)
....:
1
In [40]: if re.search("SS","ßß", re.IGNORECASE):
....: print(1)
....:
In [41]: if re.search("ß","SS", re.IGNORECASE):
....: print(1)
....:
以不区分大小写的方式比较字符串似乎无关紧要,但事实并非如此。我将使用Python 3,因为Python 2在这里还不发达。
首先要注意的是,Unicode中的大小写删除转换并不简单。存在text.lower() != text.upper().lower()的文本,例如"ß":
>>> "ß".lower()
'ß'
>>> "ß".upper().lower()
'ss'
但是让我们假设你想无案例地比较“BUSSE”和“Buße”。见鬼,您可能还想比较“BUSSE”和“BUẞE”相等——这是较新的大写形式。推荐使用casefold:
str.casefold () 返回字符串的大小写折叠副本。折叠的字符串可用于 caseless匹配。 大小写折叠类似于小写,但更激进,因为它是 用于删除字符串中的所有大小写区别。[…]
不要只使用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)
def insenStringCompare(s1, s2):
""" Method that takes two strings and returns True or False, based
on if they are equal, regardless of case."""
try:
return s1.lower() == s2.lower()
except AttributeError:
print "Please only pass strings into this method."
print "You passed a %s and %s" % (s1.__class__, s2.__class__)