質問:
Unix シェルで一般的に使用されるワイルドカード ( .py、Dat[0-9] .csv など) を使用してテキスト文字列と一致させたい場合
解決:
fnmatch モジュールは、このようなマッチングを実現するために使用できる fnmatch() と fnmatchcase() という 2 つの関数を提供します。使用方法は次のとおりです。
>>> from fnmatch import fnmatch, fnmatchcase >>> fnmatch('foo.txt', '*.txt')
True
>>> fnmatch('foo.txt', '?oo.txt')
True
>>> fnmatch('Dat45.csv', 'Dat[0-9]*')
True
>>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py'] >>> [name for name in names if fnmatch(name, 'Dat*.csv')] ['Dat1.csv', 'Dat2.csv']
>>>
fnmatch() 関数は、基礎となるオペレーティング システムの大文字と小文字を区別するルール (システムごとに異なります) を使用してパターンを照合します。
>>> # On OS X (Mac)
>>> fnmatch('foo.txt', '*.TXT') False
>>> # On Windows
>>> fnmatch('foo.txt', '*.TXT') True
>>>
この違いが気になる場合は、代わりに fnmatchcase() を使用できます。パターンの大文字と小文字の一致を正確に使用します。
>>> fnmatchcase('foo.txt', '*.TXT') False
>>>
これら 2 つの関数の見落とされがちな特徴は、ファイル名ではない文字列を扱うときにも役立つことです。
addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
次のようにリスト内包表記を書くことができます。
>>> from fnmatch import fnmatchcase
>>> [addr for addr in addresses if fnmatchcase(addr, '* ST')]
['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST']
>>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')] ['5412 N CLARK ST']
>>>
fnmatch() 関数には、単純な文字列メソッドと強力な正規表現の間のマッチング機能があります。データ処理操作に単純なワイルドカードのみが必要な場合、これは通常、合理的な解決策です。