Python 正则表达式列表理解困难

Python 正则表达式列表理解困难,python,regex,list-comprehension,Python,Regex,List Comprehension,我在Windows上使用Python3.7.6,试图使用正则表达式将foo.csv.gz文件名列表转换为相应的foo.csv文件名列表。下面是一段代码片段 zippedFileNames = [re.search('[^/]*\\.gz', link).group(0) for link in linksList] unzippedFileNames = [re.search('.*\\.csv', name).group(0) for name in zippedFileNames] 在上

我在Windows上使用Python3.7.6,试图使用正则表达式将
foo.csv.gz
文件名列表转换为相应的
foo.csv
文件名列表。下面是一段代码片段

zippedFileNames = [re.search('[^/]*\\.gz', link).group(0) for link in linksList]

unzippedFileNames = [re.search('.*\\.csv', name).group(0) for name in zippedFileNames]
在上面的代码中,
zippedFileNames
是通过将
.gz
文件名与下载链接列表隔离而创建的列表。此行的工作方式与我预期的一样,使用
zippedFileNames[0]
返回一个字符串。
zip文件名[0]
的类型是
str
zip文件名的类型是
list

但是,代码在第二行抛出一个错误:

Exception has occurred: AttributeError
'NoneType' object has no attribute 'group'
  File "H:\foo\bar\foobar.py", line 133, in <listcomp>
    x = [re.search('.*\\.csv', name).group(0) for name in zippedFileNames]
  File "H:\foo\bar\foobar.py", line 133, in <module>
    x = [re.search('.*\\.csv', name).group(0) for name in zippedFileNames]
发生异常:AttributeError “非类型”对象没有属性“组” 文件“H:\foo\bar\foobar.py”,第133行,在 x=[重新搜索('.\\.csv',name).group(0)以查找zippedFileNames中的名称] 文件“H:\foo\bar\foobar.py”,第133行,在 x=[重新搜索('.\\.csv',name).group(0)以查找zippedFileNames中的名称]
这段代码昨天还在工作,但今天停止了工作,我不确定是什么改变了它。我相信在我尝试修改第二行的
模式
以省略第一个数字并使用模式
'[^0-9\\\\\\\\\\\\\\\\\\\\.csv'
(文件名都遵循模式
0000\u foo bar\u foobar.csv.gz
)后,它就坏了。然而,即使将模式恢复到遗漏之前的旧模式,也不能解决我的问题

有什么我没看见的吗

谢谢大家!

编辑:

谢谢你的回答

我通过打印所有列表项和使用
print(zippedFileNames中无)
检查列表中是否有
None
。后一个测试返回了
False
,前一个测试返回了我期望的所有项目。我也没有在我的链接列表中找到
None

当我在
linksList
linksList[0]
的一个元素上运行regex
re.search
时,我得到了正确的字符串输出

还有什么我可以试试的吗

编辑2:

我尝试在一个单独的调用中重新使用原始的正则表达式模式
'[^/]*\\\.gz'
,结果成功了。然后我还尝试使用模式
“[^/]*\\\.csv\\.gz”
,希望得到与前一个模式相同的结果,但该模式也返回了一个错误。我怀疑这些错误与
\\.csv
有关

分辨率 我在
.csv
上进行了匹配,但结果是我也有一个
.report
文件,而这个文件正在丢弃整个脚本。迭代匹配有助于隔离问题。为了解决正则表达式,我匹配了模式
'.\\\[^.gz]
以保留所有文件扩展名,而不仅仅是
.csv
。非常感谢

如果字符串不匹配,则返回
None
。你的第二个正则表达式似乎错了。我想应该是
'.\.csv
。你可以用它来测试

[编辑]:您的正则表达式是正确的,如果字符串不匹配,您可能有一个文件与
zip文件名中的正则表达式不匹配。你的第二个正则表达式似乎错了。我想应该是
'.\.csv
。你可以用它来测试


[编辑]:您的正则表达式是正确的,您可能有一个与
zippedFileName

中的正则表达式不匹配的文件,请检查您正在使用的列表、zippedFileNames或linksList中是否有None或空值。

检查您正在使用的列表中是否有None或空值,压缩文件名或链接列表。

您可以使用

重新导入
zippedFileNames=['0001_foo1.csv','def.bz','0000_foo2.csv.gz']
解压缩文件名=[]
对于ZippedFileName中的名称:
m=re.match(r“\d+.\.csv)”,名称)
如果m:
解压缩文件名.append(m.group(1))
打印(解压缩文件名)
#=>['foo1.csv','foo2.csv']

在这里,
解压文件名
被声明为空列表。然后,迭代
zippedFileNames
,根据
\d+.\.csv)
regex检查每个名称(注意
re.match
仅搜索字符串开头的匹配项),以及是否存在匹配项(
if m:
)组1内容将附加到
解压缩文件名列表中。

您可以使用

重新导入
zippedFileNames=['0001_foo1.csv','def.bz','0000_foo2.csv.gz']
解压缩文件名=[]
对于ZippedFileName中的名称:
m=re.match(r“\d+.\.csv)”,名称)
如果m:
解压缩文件名.append(m.group(1))
打印(解压缩文件名)
#=>['foo1.csv','foo2.csv']


在这里,
解压文件名
被声明为空列表。然后,迭代
zippedFileNames
,根据
\d+.\.csv)
regex检查每个名称(注意
re.match
仅搜索字符串开头的匹配项),以及是否存在匹配项(
if m:
)第1组内容附加到
解压缩文件名列表中。

第二个正则表达式有什么问题?这没什么问题。这和你的建议一样。事实上,我忘了你需要用反斜杠来逃避反斜杠。第二个正则表达式有什么问题?这没什么问题。这和你的建议完全一样。事实上,我忘了你需要用反斜杠来转义反斜杠。看,如果你只需要检查字符串是否包含
.csv
,那么你不需要正则表达式,只需使用
解压文件名=[name for name in zippedFileNames if.csv'in name]
。瞧。@WiktorStribiżew这是一个我不知道的好把戏。但是,我的目标是从
0000_foo.csv.gz
文件名中提取
foo.csv
文件名。这就是为什么我使用正则表达式来解决这个问题。@WiktorStribiżew,我在
.csv
上进行了匹配,但是