為了在文本操作時忽略大小寫,需要在使用re 模塊的時候給這些操作提供re.IGNORECASE 標志參數。比如
>>> text = 'UPPER PYTHON, lower python, Mixed Python'
>>> re.findall('python', text, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
>>> 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
下面是使用上述函數的方法:
>>> re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
'UPPER SNAKE, lower snake, Mixed Snake'
>>>
注: matchcase('snake') 返回了一個回調函數(參數必須是match 對象), sub() 函數除了接受替換字符串外,還能接受一個回調函數。