Python Glob 正则表达式文件搜索,从多个匹配项中搜索单个结果

Python Glob regex file search with for single result from multiple matches

在 Python 中,我试图在目录中查找特定文件,比方说,'file3.txt'。目录中的其他文件是 'flie1.txt'、'File2.txt'、'file_12.txt' 和 'File13.txt'。该号码是唯一的,因此我需要按用户提供的号码进行搜索。

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

问题是,returns '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')

我如何得到'file3.txt'?

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))]

glob 的问题是它的正则表达式有限。例如,您不能将“[a-z_]+”与 glob.

所以,最好编写自己的 RegEx,如下所示:

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