不区分大小写的匹配python

时间:2014-04-14 14:43:04

标签: python regex string case-sensitive

我希望匹配另一个列表中的项目,而不必担心区分大小写。

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 :(得分:5)

使用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

答案 1 :(得分:2)

为什么不这样做:

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

这使用.lower()进行比较,得出所需的结果。

答案 2 :(得分: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