【问题标题】:Finding if a list item is in a filename查找列表项是否在文件名中
【发布时间】:2020-10-21 19:03:57
【问题描述】:

假设我有一个文件名,如:D_Passaic_F01_NBR_E0003.tif 那是在我使用 Python 迭代的文件夹中。假设我想获取 E0001 和 E0010 之间的所有文件。我可能会列出如下列表:select_libr = ['E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010']。使用这个列表,我如何检查文件名是否会遍历目录以提取那些关键文件?

for filename in os.listdir(directory):
    if (filename.startswith("D_")) and (filename.endswith(".tif") or filename.endswith(".tiff")):
        print(os.path.join(directory, filename))
    else:
        continue

我想做的是:...and (item in select_libr in filename),但我不确定这里的语法是否正确。有什么建议吗?

【问题讨论】:

  • 我试过:` if (re.fullmatch(r"D_.*_(E\d{4})\.tif", filename)): print(os.path.join(directory , filename))`,但这只是打印了所有内容。
  • 对不起,我没有正确阅读。 r"D_.*_(E00(?:10|0\d))\.tiff?" 有效吗?

标签: python-3.x loops substring


【解决方案1】:

您可以使用正则表达式从Exxx 中提取数字,然后用它做您想做的事情。例如,

E(\d+)\.tiff?$ 将匹配 E,然后是一个或多个数字,然后是 .tif,然后是字符串末尾的可选 f。更重要的是,它将数字捕获为一个组,并允许我们仅从匹配对象中提取数字。 Try it

for filename in os.listdir(directory):
    research = re.search(r"E(\d+)\.tiff?", filename)
    if research: # If there was a match
        fnum = research.group(1) # This is the string "0003", for example
        # Then do whatever you want with it
        if 0 <= int(fnum) <= 10:
            print(filename)

如果您想允许任意值,我强烈建议使用 set 而不是 list 来存储这些值,因为在集合中检查成员资格比在列表中便宜。

select_libr = {'E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010'}

并更改正则表达式,以便同时捕获 E:(E\d+)\.tiff? Try it

for filename in os.listdir(directory):
    research = re.search(r"(E\d+)\.tiff?", filename)
    if research: # If there was a match
        fnum = research.group(1) # This is the string "E0003", for example
        # Then do whatever you want with it
        if fnum in select_libr:
            print(filename)

为确保您的文件名以D_ 开头,您可以将^D_.*? 添加到其他正则表达式之前。这会在字符串的开头查找D_,然后是任意字符。其他一切都可以保持不变。 Try it

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2012-09-23
    • 2019-01-14
    • 2022-12-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多