Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式数字和下划线_Python_Regex - Fatal编程技术网

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