Python中的不区分大小写匹配

1 投票
3 回答
3989 浏览
提问于 2025-04-18 02:41

我想在一个列表中找到另一个列表里的项目,而且不想考虑大小写的问题。

mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']

我之前是这样做的:

for item in mylist2:
    if item in mylist1:
        print "true"
    else:
        print "false"

但是这样做不行,因为它不区分大小写。

我知道可以用re.match("TeSt", "Test", re.IGNORECASE)来处理大小写问题,但我该怎么把它应用到我的例子里呢?

3 个回答

0

其他的回答都是对的。不过它们没有考虑到两个列表中可能会有大小写混合的情况。如果你需要处理这种情况的话:

mylist1 = ['fbh_q1ba8', 'fbh_q1ba9', 'fbh_q1ba10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']

for item in mylist2:
    found = "false"
    for item2 in mylist1:
        if item.lower() == item2.lower():
            found = "true"
    print found
2

为什么不直接这样做:

for item in mylist2:
    if item.lower() in [j.lower() for j in mylist1]:
        print "true"
    else:
        print "false"

这里使用了 .lower() 方法来进行比较,这样就能得到想要的结果。

6

使用 str.lower() 来统一大小写:

for item in mylist2:
    print item.lower() in mylist1

in 操作符可以直接返回 TrueFalse,所以最简单的办法就是直接打印这个结果:

>>> mylist1 = ['fbh_q1ba8', 'fhh_q1ba9', 'fbh_q1ba10','hoot']
>>> mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
>>> for item in mylist2:
...     print item.lower() in mylist1
... 
True
False
False
True
False
False
False

如果 mylist1 里面有大小写混合的值,你需要明确地写出循环;可以用一种叫做 生成器表达式 的方式来生成小写的值;这样测试时只会把需要的小写元素进行处理,以确保找到匹配项:

for item in mylist2:
    print item.lower() in (element.lower() for element in mylist1)

演示

>>> mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
>>> for item in mylist2:
...     print item.lower() in (element.lower() for element in mylist1)
... 
True
False
False
True
False
False
False

另一种方法是使用 any()

for item in mylist2:
    print any(item.lower() == element.lower() for element in mylist1)

any() 也有短路特性;一旦找到一个 True 的值(也就是找到一个匹配的元素),生成器表达式的迭代就会提前停止。不过,这个方法在每次迭代时都要把 item 转换成小写,所以效率稍微低一点。

另一个演示:

>>> for item in mylist2:
...     print any(item.lower() == element.lower() for element in mylist1)
... 
True
False
False
True
False
False
False

撰写回答