Python正则表达式数字和下划线

时间:2016-09-27 20:03:12

标签: python regex

我正在尝试从文件名遵循此模式的目录中获取文件列表:

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(不区分大小写的文件扩展名)?

由于

4 个答案:

答案 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会将其视为特殊字符,因为在正则表达式.中表示“任何字符”。

除此之外,您不会在表达式上处理大写异常。您应该为datDAT做出选择。

如果进行了两项更改,它应该如下所示:

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正则表达式)。