TL;DR
Too Long
でも無いけどざっくり3行
-
pathlib.Path().glob()
でワイルドカード(*
)を使い、かつ対象を絞りたい場合のやり方 -
pathlib.Path().glob(*[!hoge])
のように[!xxx]
を用いれば良い - 元ネタは Stack Overflow
検証環境
MacBookPro
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14
BuildVersion: 18A391
$ pyenv --version
pyenv 1.1.5
$ python --version
Python 3.6.2 :: Anaconda, Inc.
やり方
[!]
を用いる
>>> import pathlib
# そのままだと hoge.txt, hoge.txt.bak が引っ掛かる
>>> list(pathlib.Path().glob("hoge*"))
[PosixPath('hoge.txt'), PosixPath('hoge.txt.bak')]
# .bak を除外したい場合は [!bak] を指定
>>> list(pathlib.Path().glob("hoge*[!bak]"))
[PosixPath('hoge.txt')]
何が行われているのか?
実装をちゃんと見ていないので詳しくはわかりませんが、「正規表現っぽい何か」が適用されるようです。ドキュメントには詳細が書かれてなかった。
(間違っていればマサカリコメントお願いします)
# あらかじめ touch で hoge.txt.1,2,3 を生成
>>> list(pathlib.Path().glob("hoge.txt*"))
[PosixPath('hoge.txt.1'), PosixPath('hoge.txt'), PosixPath('hoge.txt.bak'), PosixPath('hoge.txt.2'), PosixPath('hoge.txt.3')]
# 数値やアルファベットの範囲指定もできる
>>> list(pathlib.Path().glob("hoge.txt.[1-3]"))
[PosixPath('hoge.txt.1'), PosixPath('hoge.txt.2'), PosixPath('hoge.txt.3')]
>>> list(pathlib.Path().glob("hoge.txt.ba[a-z]"))
[PosixPath('hoge.txt.bak')]
詳しく知りたい方は実装を追ってみてください。
もっとちゃんと検索したい
re.serch
との組み合わせで、より複雑な抽出が可能になります、詳しくは以下。