Python正则表达式数字和下划线
我试图从文件名遵循以下模式的目录中获取文件列表:Python正则表达式数字和下划线,python,regex,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.err
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)]
另外,我如何允许.dat和.dat(不区分大小写的文件扩展名)
感谢使用pattern.search()
而不是pattern.match()
pattern.match()。
pattern.search()
pattern.match()。
pattern.search()
搜索字符串中的任意位置。这是否符合您的要求
>>> 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'>
>>>
>>重新导入
>>>pattern=r'\A[A-z]+\d{4}\ud{2}\ud{2}\.dat\z'
>>>字符串='FOO_2016_03_23.dat'
>>>重新搜索(模式、字符串、重新忽略案例)
>>>
它似乎与您作为示例给出的字符串的格式相匹配。这是否符合您的要求
>>> 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'>
>>>
>>重新导入
>>>pattern=r'\A[A-z]+\d{4}\ud{2}\ud{2}\.dat\z'
>>>字符串='FOO_2016_03_23.dat'
>>>重新搜索(模式、字符串、重新忽略案例)
>>>
它似乎与您作为示例给出的字符串的格式相匹配。您的表达式有两个问题:
re.compile(r'(\d{4})(\d{2})(\d{2}).dat')
正如前面的评论所述,第一个问题是,应该在dat
前面加一个反斜杠(\
)对
前面的
进行转义。否则,python会将其视为特殊字符,因为在regex
中表示“任何字符”
除此之外,您没有处理表达式上的大写异常。您应该为此分组,并尽可能选择dat
和dat
在进行了这两项更改后,它应该如下所示:
re.compile(r'(\d{4})\(\d{2})\.(?:dat | dat)
另外,我在组的开头添加了?:
,以便正则表达式匹配器在结果中忽略它。表达式有两个问题:
re.compile(r'(\d{4})(\d{2})(\d{2}).dat')
正如前面的评论所述,第一个问题是,应该在dat
前面加一个反斜杠(\
)对
前面的
进行转义。否则,python会将其视为特殊字符,因为在regex
中表示“任何字符”
除此之外,您没有处理表达式上的大写异常。您应该为此分组,并尽可能选择dat
和dat
在进行了这两项更改后,它应该如下所示:
re.compile(r'(\d{4})\(\d{2})\.(?:dat | dat)
作为额外说明,我在组的开头添加了?:
,因此正则表达式匹配器在结果中忽略它。以下内容应与您要求的内容匹配
[^_]+[_]\d{4}[_]\d{2}[_]\d{2}[\.]\w+
如果希望验证正则表达式,我建议将来使用(python正则表达式)或(javascript正则表达式) 以下内容应符合您的要求
[^_]+[_]\d{4}[_]\d{2}[_]\d{2}[\.]\w+
如果希望验证正则表达式,我建议将来使用(python正则表达式)或(javascript正则表达式) “escape”是什么意思?尝试re.compile(r'(?i)\d{4}\ud{2}\ud{2}\.dat$)
然后if pattern.search(f)
更改为search确实修复了我添加转义字符时的解决方案,谢谢。我认为需要在字符串末尾匹配“date”+.dat
,这就是为什么我建议在末尾使用$/code><代码>(?i)
=re.i
。您的尝试失败,因为1。您编译了一个几乎正确的(\d{4})u(\ d{2})(\d{2}).dat
regex(未能转义
),但使用re.match
(仅在字符串开头搜索)2运行<代码>r'*(\d{4}){(\d{2}){(\d{2}).dat'
regex包含一个错误,因为您将*
量词(零次或多次出现,尽可能多)放在开头,但不能有多个开头,因此它被视为人为错误。您需要检查模式是否出现在字符串的末尾,并确保您使用的是re.search
。您所说的“escape”是什么意思?尝试re.compile(r'(?i)\d{4}\d{2}\d{2}.dat$)
然后if pattern.search(f)
更改为search确实修复了我添加转义字符时的解决方案,Thank我认为您需要在字符串末尾匹配“date”+.dat
,这就是为什么我建议在末尾匹配$
<代码>(?i)
=re.i
。您的尝试失败,因为1。您编译了一个几乎正确的(\d{4})u(\ d{2})(\d{2}).dat
regex(未能转义
),但使用re.match
(仅在字符串开头搜索)2运行<代码>r'*(\d{4}){(\d{2}){(\d{2}).dat'
regex包含一个错误,因为您将*
量词(零次或多次出现,尽可能多)放在开头,但不能有多个开头,因此它被视为人为错误。您需要检查模式是否出现在字符串的末尾,并确保您正在使用re.search
。是的,这很有效,谢谢。我会尽力消化它。什么是\Z?如果您试图了解它的功能,请运行以下命令:re.compile(pattern,re.DEBUG)
,尽管它与我的.DAT文件不匹配。我有资金。我使用的是你的原始表格[Dd][Aa]。。。。确切地说:pattern=re.compile(r'(\d{4})\(\d{2})\[Dd][Aa][Tt]')这就是为什么需要使用第三个函数调用re.search