我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
当前回答
你可以这样做
matcher = re.compile('MICHAEL89', re.IGNORECASE)
filter(matcher.match, USERNAMES)
更新:玩了一点,我认为你可以得到一个更好的短路类型的方法使用
matcher = re.compile('MICHAEL89', re.IGNORECASE)
if any( ifilter( matcher.match, USERNAMES ) ):
#your code here
filter函数来自itertools,它是Python中我最喜欢的模块之一。它比生成器快,但只在调用时创建列表的下一项。
其他回答
我会做一个包装,这样你就不会受到伤害了。最低限度,例如……:
class CaseInsensitively(object):
def __init__(self, s):
self.__s = s.lower()
def __hash__(self):
return hash(self.__s)
def __eq__(self, other):
# ensure proper comparison between instances of this class
try:
other = other.__s
except (TypeError, AttributeError):
try:
other = other.lower()
except:
pass
return self.__s == other
现在,如果caseinsensitive ('MICHAEL89')在whatever:应该按照要求行事(无论右边是列表、字典还是集合)。(它可能需要更多的努力来实现字符串包含的类似结果,避免在某些情况下涉及unicode的警告,等等)。
这里有一种方法:
if string1.lower() in string2.lower():
...
为此,string1和string2对象的类型都必须是string。
为了把它写在一行里,我是这样做的:
if any(([True if 'MICHAEL89' in username.upper() else False for username in USERNAMES])):
print('username exists in list')
不过我并没有在时间上进行测试。我不确定它有多快/有效率。
你可以这样做
matcher = re.compile('MICHAEL89', re.IGNORECASE)
filter(matcher.match, USERNAMES)
更新:玩了一点,我认为你可以得到一个更好的短路类型的方法使用
matcher = re.compile('MICHAEL89', re.IGNORECASE)
if any( ifilter( matcher.match, USERNAMES ) ):
#your code here
filter函数来自itertools,它是Python中我最喜欢的模块之一。它比生成器快,但只在调用时创建列表的下一项。
通常(至少在oop中),您可以按照您想要的方式来塑造对象。USERNAMES中的name不区分大小写,因此USERNAMES需要更改:
class NameList(object):
def __init__(self, names):
self.names = names
def __contains__(self, name): # implements `in`
return name.lower() in (n.lower() for n in self.names)
def add(self, name):
self.names.append(name)
# now this works
usernames = NameList(USERNAMES)
print someone in usernames
这样做的好处是,它为许多改进开辟了道路,而无需更改类之外的任何代码。例如,您可以将self.names更改为一个集以便更快地查找,或者只计算一次(n.lower() For self.names中的n)并将其存储在类中,等等……