Python3 - 用Shell萬用字元匹配字串

weixin_33866037發表於2018-12-18

問題

使用 Unix Shell 中常用的萬用字元(比如 .py , Dat[0-9].csv 等)去匹配文字字串

解決方案

fnmatch 模組提供了兩個函式—— fnmatch()fnmatchcase(),可以實現這樣的匹配。用法如下:

from fnmatch import fnmatch, fnmatchcase

print(fnmatch('foo.txt', '*.txt'))
print(fnmatch('foo.txt', '?oo.txt'))
print(fnmatch('Dat45.csv', 'Dat[0-9]*'))
True
True
True

names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']
fn = [name for name in names if fnmatch(name, 'Dat*.csv')]
print(fn)
['Dat1.csv', 'Dat2.csv']

fnmatch() 函式使用底層作業系統的大小寫敏感規則進行匹配,不同的作業系統不一樣。比如:

# On OS X (Mac)
fnmatch('foo.txt', '*.TXT')    # returen False

# On Windows
fnmatch('foo.txt', '*.TXT')    # return True

如果對大小寫匹配的區別很在意,可以使用 fnmatchcase() 來代替,該函式完全按區別大小寫匹配。比如:

print(fnmatchcase('foo.txt', '*.TXT'))
False

討論

fnmatch() 函式匹配能力介於簡單的字串方法和強大的正規表示式之間。 如果在資料處理操作中只需要簡單的萬用字元就能完成的時候,這通常是一個比較合理的方案。

如果程式碼需要做檔名的匹配,最好使用 glob 模組。

相關文章