• 2.6 字符串忽略大小写的搜索替换
    • 问题
    • 解决方案
    • 讨论

    2.6 字符串忽略大小写的搜索替换

    问题

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

    解决方案

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

    1. >>> text = 'UPPER PYTHON, lower python, Mixed Python'
    2. >>> re.findall('python', text, flags=re.IGNORECASE)
    3. ['PYTHON', 'python', 'Python']
    4. >>> re.sub('python', 'snake', text, flags=re.IGNORECASE)
    5. 'UPPER snake, lower snake, Mixed snake'
    6. >>>

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

    1. def matchcase(word):
    2. def replace(m):
    3. text = m.group()
    4. if text.isupper():
    5. return word.upper()
    6. elif text.islower():
    7. return word.lower()
    8. elif text[0].isupper():
    9. return word.capitalize()
    10. else:
    11. return word
    12. return replace

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

    1. >>> re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
    2. 'UPPER SNAKE, lower snake, Mixed Snake'
    3. >>>

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

    讨论

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

    原文:

    http://python3-cookbook.readthedocs.io/zh_CN/latest/c02/p06_search_replace_case_insensitive.html