Python 正则表达式部分不区分大小写

Python regex partially case insensitive

如何用简短的方式做到这一点?我有 2 个字符串,我想逐个搜索,但是:

  • lowercase letter matches to lower- and uppercase
  • uppercase letter matches only to uppercase.

示例:

"abcd" 匹配 "AbCd""ABCD""abcd"

"Abcd" 匹配 "Abcd""ABcd" 等,但不匹配 "abcd"

您需要转换正则表达式,例如

def transform(regex):
    return ''.join([
        "[%s%s]" % (c, c.upper())
            if c.islower()
            else c
        for c in regex
    ])


transformed = transform('Abcd')

将正则表达式 Abcd 转换为 A[bB][cC][dD]

当然这 工作,如果你的实际正则表达式已经有字符 类 [a-z]

您可以使用以下功能:

>>> def match(s1,s2):
...    if len(s2)!=len(s2):
...          return False
...    else :
...          return all(i==j if i.isupper() else i==j.lower() for i,j in zip(s1,s2))
... 

演示:

>>> match('Abcd','aBcd')
False
>>> match('Abcd','ABcd')
True
>>> match('AbCd','ABcd')
False
>>> match('AbCd','ABCd')
True

在这个函数中,首先你比较字符串的长度,然后你需要比较字符串中的每个字母,你可以用 zip 函数来完成,所以如果第一个字母是大写您只需按原样比较字母(这是 True 只是如果两个字母相等并且第二个像第一个一样大)但是如果第一个字母较低,则将第一个字母与第二个的小写字母进行比较。

我要做的是遍历要匹配的字符串,如果找到小写字母,将正则表达式放入 [character|CHARACTER] 中,使正则表达式不区分大小写,如果字符已经是大写字母,然后将其强制为大写(保持原样)。

我创建了一个简单的测试,其中包含存储在 input_string 中的三个示例输出(作为要匹配的字符串)和四个要再次匹配的示例字符串(下面示例中的内容存储在 test_string.

import re

for input_string in ['abcd', 'Abcd', 'abCD']:
    created_regex = ''
    for character in input_string:
        if character.islower():
            created_regex += '[%s%s]' % (character, character.upper())
        else:
            created_regex += character

    regex = re.compile(created_regex)
    for test_string in ['AbCd', 'abcd', 'ABCD', 'ABcd']:
        print ('From input_string="%s". Does %s match %s ? %s'
                % (input_string, test_string, created_regex,
                   regex.match(test_string) is not None))

这输出:

From input_string="abcd". Does AbCd match [aA][bB][cC][dD] ? True
From input_string="abcd". Does abcd match [aA][bB][cC][dD] ? True
From input_string="abcd". Does ABCD match [aA][bB][cC][dD] ? True
From input_string="abcd". Does ABcd match [aA][bB][cC][dD] ? True
From input_string="Abcd". Does AbCd match A[bB][cC][dD] ? True
From input_string="Abcd". Does abcd match A[bB][cC][dD] ? False
From input_string="Abcd". Does ABCD match A[bB][cC][dD] ? True
From input_string="Abcd". Does ABcd match A[bB][cC][dD] ? True
From input_string="abCD". Does AbCd match [aA][bB]CD ? False
From input_string="abCD". Does abcd match [aA][bB]CD ? False
From input_string="abCD". Does ABCD match [aA][bB]CD ? True
From input_string="abCD". Does ABcd match [aA][bB]CD ? False