2017-09-22 5 views
1

Pythonでは、ディレクトリ内の特定のファイルを見つけようとしています。たとえば、 'file3.txt'としましょう。ディレクトリ内の他のファイルは 'flie1.txt'、 'File2.txt'、 'file_12.txt'、 'File13.txt'です。番号はユニークなので、ユーザーが入力した番号で検索する必要があります。Python Glob regexファイルで複数の一致の結果を1つだけ検索する

file_num = 3 
my_file = glob.glob('C:/Path_to_dir/' + r'[a-zA-Z_]*' + f'{file_num} + '.txt') 

問題は、 'file3.txt'と 'File13.txt'の両方を返します。私は後読みしようとした場合、私は、ファイルを取得していない:

file_num = 3 
my_file = glob.glob('C:/Path_to_dir/' + r'[a-zA-Z_]*' + r'(?<![1-9]*)' + f'{file_num}' + '.txt') 

どうすれのみ GET 'file3.txt' を実行しますか?

答えて

2

globは正規表現ではなく、UNIXのワイルドカードを受け入れます。それらはあまり強力ではありませんが、依頼しているものはまだ達成することができます。これは:

glob.glob("/path/to/file/*[!0-9]3.txt") 

は、3桁の数字を含まないファイルをフィルタリングします。

他の例について、あなたはリストの内包と正規表現を使用することができますが:

[x for x in glob.glob("/path/to/file/*") if re.match(some_regex,os.path.basename(x))] 
1

globの問題点は、正規表現を制限していることです。たとえば、「[a-z _] +」はglobとすることはできません。

だから、それはこのように、独自の正規表現を記述すると良いでしょう:

import re 
import os 

file_num = 3 
file_re = r"[a-z_]+{file_num}\.txt".format(file_num=file_num) 
match_file = re.compile(file_re, flags=re.IGNORECASE).match 

work_dir = "C:/Path_to_dir/" 
names = list(filter(match_file, os.listdir(work_dir))) 
関連する問題