我正在尝试从文件名遵循以下模式的目录中获取文件列表:
PREFIX_YYYY_MM_DD.dat
例如
FOO_2016_03_23.dat
似乎无法获得正确的正则表达式。我尝试了以下方法:
pattern = re.compile(r'(\d{4})_(\d{2})_(\d{2}).dat')
>>> []
pattern = re.compile(r'*(\d{4})_(\d{2})_(\d{2}).dat')
>>> sre_constants.error: nothing to repeat
正则表达式对我来说无疑是一个弱点。谁能解释我哪里出错了?
要获取文件,我正在做:
files = [f for f in os.listdir(directory) if pattern.match(f)]
PS,我如何允许 .dat 和 .DAT(不区分大小写的文件扩展名)?
谢谢
请您参考如下方法:
你的表达有两个问题: re.compile(r'(\d{4})_(\d{2})_(\d{2}).dat')
第一个,正如前面的评论所述,. 就在 dat 之前,应该通过放置反斜杠 (\ ) 前。否则,python 会将其视为特殊字符,因为在正则表达式中 . 表示“任何字符”。
除此之外,您没有处理表达式中的大写异常。您应该为此创建一个组,将 dat 和 DAT 作为可能的选择。
完成这两项更改后,它应该看起来像:
re.compile(r'(\d{4})_(\d{2})_(\d{2})\.(?:dat|DAT)')
作为额外说明,我在组的开头添加了 ?:,因此正则表达式匹配器会在结果中忽略它。
