2.6 字符串忽略大小寫的搜索替換

2018-02-24 15:26 更新

問題

你需要以忽略大小寫的方式搜索與替換文本字符串

解決方案

為了在文本操作時忽略大小寫,你需要在使用re模塊的時候給這些操作提供 re.IGNORECASE 標志參數(shù)。比如:

>>> 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'
>>>

最后的那個例子揭示了一個小缺陷,替換字符串并不會自動跟被匹配字符串的大小寫保持一致。為了修復這個,你可能需要一個輔助函數(shù),就像下面的這樣:

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

下面是使用上述函數(shù)的方法:

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

譯者注: matchcase('snake') 返回了一個回調函數(shù)(參數(shù)必須是 match 對象),前面一節(jié)一節(jié)提到過,sub() 函數(shù)除了接受替換字符串外,還能接受一個回調函數(shù)。

討論

對于一般的忽略大小寫的匹配操作,簡單的傳遞一個 re.IGNORECASE 標志參數(shù)就已經(jīng)足夠了。但是需要注意的是,這個對于某些需要大小寫轉換的Unicode匹配可能還不夠,參考2.10小節(jié)了解更多細節(jié)。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號