代码之家  ›  专栏  ›  技术社区  ›  Prat

Python Glob regex文件搜索,从多个匹配中搜索单个结果

  •  1
  • Prat  · 技术社区  · 7 年前

    在Python中,我试图在一个目录中找到一个特定的文件,比如“file3”。txt'。目录中的其他文件是“flie1”。txt','文件2。txt','文件12。“txt”和“File13”。txt'。号码是唯一的,所以我需要按用户提供的号码进行搜索。

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

    问题是,这会同时返回“file3”。txt和文件13。txt'。如果我尝试查找,则不会得到任何文件:

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

    我该怎么做 只有

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jean-François Fabre Darshan Ambre    7 年前

    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))]
    
        2
  •  1
  •   Laurent LAPORTE    7 年前

    glob 就是它限制了正则表达式。例如,不能将“[a-z_]+”与

    因此,最好编写自己的正则表达式,如下所示:

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