繁体   English   中英

列表理解的正则表达式问题

[英]Regex trouble with list comprehension

I am working in Python 3.7.6 on Windows and am attempting to use regex to transform one list of foo.csv.gz filenames into a list of the corresponding foo.csv filenames. 代码片段如下。

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]返回一个字符串。 zippedFileNames[0]的类型是strzippedFileNames的类型是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]

这段代码昨天工作,但今天停止工作,我不确定我改变了什么来破坏它。 我相信在我尝试修改第二行的pattern以使用模式'[^0-9\\_].*\\.csv' (文件名都遵循模式0000_foo_bar_foobar.csv.gz )。 但是,即使在遗漏之前将模式恢复为旧模式也不能解决我的问题。

有什么我没看到的吗?

谢谢!

编辑:

谢谢您的回答。

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

当我仅对 linksList 的一个元素linksList linksList[0]运行正则表达式re.search时,我得到了正确的字符串 output。

我还有其他可以尝试的方法吗?

编辑2:

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

解决方案我在.csv上进行匹配,但事实证明我也有一个.report文件,而且那个文件正在丢弃整个脚本。 遍历匹配有助于隔离问题。 为了解决正则表达式,我匹配了模式'.*\\[^.gz]'以保留所有文件扩展名,而不仅仅是.csv 非常感谢!!

如果字符串不匹配, re.search返回None 您的第二个正则表达式似乎是错误的。 我认为应该是'.*\.csv 您可以使用regex101对其进行测试。

[编辑]:您的正则表达式是正确的,您可能有一个与zippedFileName中的正则表达式不匹配的文件

检查您正在使用的列表、zippedFileNames 或 linksList 中是否有 None 或空值。

您可以使用

import re
zippedFileNames=['0001_foo1.csv', 'def.bz', '0000_foo2.csv.gz']
unzippedFileNames = []
for name in zippedFileNames:
  m = re.match(r"\d+_(.*\.csv)", name)
  if m:
    unzippedFileNames.append(m.group(1))
print(unzippedFileNames)
# => ['foo1.csv', 'foo2.csv']

请参阅Python 演示

在这里, unzippedFileNames被声明为一个空列表。 然后,遍历zippedFileNames ,每个名称都根据\d+_(.*\.csv)正则表达式进行检查(注意re.match仅在字符串的开头搜索匹配项),如果有匹配项( if m: )第 1 组的内容被附加到unzippedFileNames列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM