我正在尝试从文件名遵循此模式的目录中获取文件列表:
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(不区分大小写的文件扩展名)?
由于
答案 0 :(得分:2)
使用pattern.search()
代替pattern.match()
。
pattern.match()
始终匹配字符串的开头(包括PREFIX)。
pattern.search()
搜索字符串中的任何位置。
答案 1 :(得分:2)
你的表达有两个问题:
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)')
作为额外注释,我在组的开头添加了?:
,因此正则表达式匹配器会在结果处忽略它。
答案 2 :(得分:1)
这样做你想要的吗?
>>> import re
>>> pattern = r'\A[a-z]+_\d{4}_\d{2}_\d{2}\.dat\Z'
>>> string = 'FOO_2016_03_23.dat'
>>> re.search(pattern, string, re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 18), match='FOO_2016_03_23.dat'>
>>>
它似乎与您提供的字符串格式相匹配。
答案 3 :(得分:1)
以下内容应符合您的要求。
[^_]+[_]\d{4}[_]\d{2}[_]\d{2}[\.]\w+
如果您想要验证正则表达式,我建议将来使用https://regex101.com/(对于python正则表达式)或http://regexr.com/(对于javascript正则表达式)。