问题

你需要以忽略大小写的方式搜索与替换文本字符串

解决方案

为了在文本操作时忽略大小写,你需要在使用re模块的时候给这些操作提供re.IGNIRECASE标志参数。比如:

import re

text = 'UPPER PYTHON, lower python, Mixed Python'
print(re.findall('python',text,flags=re.IGNORECASE))  # ->['PYTHON', 'python', 'Python']
print(re.sub('python','snake',text,flags=re.IGNORECASE))  # ->UPPER snake, lower snake, Mixed snake

最后那个例子揭示了一个小缺陷,替换字符串并不会自动跟匹配字符串的大小写保持一致。为了修复这个,你可能需要又给辅助函数,就像下面的这样。

def matchcase(word):
    def replace(m):
        text = m.group()
        if text.isupper():
            return word.upper()
        elif text.islower():
            return word.lower()
        elif text[0].isupper():
            return word.capitalize()
        else:
            return word

    return replace

下面是使用上述函数的方法:

print(re.sub('python',matchcase('snake'),text,flags=re.IGNORECASE))
# ->UPPER SNAKE, lower snake, Mixed Snake

matchcase()返回了一个回调函数(参数必须是match对象)。前面章节提到过,sub()函数除了接受替换字符串外还能接受一个回调函数。

讨论

对于一般的忽略大小写的匹配操作,简单的传递一个re.IGNORECASE标志参数就已经足够了,但是需要注意的是,这个对于某些需要大小写转换的Unicode匹配可能还不够。