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
如何用简短的方式做到这一点?我有 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