如何判断一个字符串是否包含列表中的所有子字符串?[Python]

6

以下是场景:

我有一个带有时间戳的文件名列表,其中时间戳前后有字符。

例如:prefix_20160817_suffix

我想要一个包含特定前缀、后缀和时间戳部分的列表(最终将是原始列表的子集)。这些特定字符串已经在一个列表中给出。注意:这个"包含"列表的大小可能会不同

例如:['prefix1', '2016', 'suffix']['201608', 'suffix']

如何轻松获取包含"包含"数组中每个元素的文件名列表?

以下是示例伪代码,展示了我想要的效果:

for each fileName in the master list:
    if the fileName contains EVERY element in the "contains" array:
        add fileName to filtered list of filenames

filtered_list = [fn for fn in master_list if all(item in fn for item in contains_list)] - Steven Rumbalski
all(element in fileName for element in contains)的意思是什么? - Łukasz Rogalski
1
出于好奇,为什么要踩我?我应该做些什么不同的吗? - Luke H
5个回答

5

我会将列表编译成一个fnmatch模式

import fnmatch

pattern = '*'.join(contains)
filetered_filenames = fnmatch.filter(master_list, pattern)

这基本上将contains中的所有字符串用*通配符连接成一个全局模式。假设contains的顺序很重要。鉴于您正在查找前缀、后缀和日期(部分),这不是太难理解。
需要注意的是,如果您在运行此命令时使用不区分大小写的文件系统,则fnmatch匹配也不区分大小写。在这种情况下,这通常正是您想要的。

谢谢,这是一个很棒的答案。我可以通过用户输入将我的“包含”数组作为带星号的字符串获取,这样甚至更加顺畅。 - Luke H
1
@LukeH:如果你要应用到os.listdir()的输出上,你可能也想查看一下glob模块,从而避免自己调用os.listdir() - Martijn Pieters

5
您正在寻找类似以下内容的东西(使用列表推导和 all() ):
>>> files = ["prefix_20160817_suffix", "some_other_file_with_suffix"]
>>> contains = ['prefix', '2016', 'suffix']
>>> [ f for f in files if all(c in f for c in contains) ]
['prefix_20160817_suffix']

2

给定:

>>> cond1=['prefix1', '2016', 'suffix']
>>> cond2=['201608', 'suffix']
>>> fn="prefix_20160817_suffix"

您可以使用in 和(在中间示例中)列表推导式检查条件列表中每个子字符串的存在性:
>>> [e in fn for e in cond1]
[False, True, True]
>>> [e in fn for e in cond2]
[True, True]

然后可以在单个all语句中使用它来测试所有子字符串:

>>> all(e in fn for e in cond1)
False
>>> all(e in fn for e in cond2)
True

接着,您可以使用filter(或使用列表推导式或循环)来过滤列表:

>>> fns=["prefix_20160817_suffix", "prefix1_20160817_suffix"]
>>> filter(lambda fn: all(e in fn for e in cond1), fns)
['prefix1_20160817_suffix']
>>> filter(lambda fn: all(e in fn for e in cond2), fns)
['prefix_20160817_suffix', 'prefix1_20160817_suffix']

1

你的伪代码离可用实现并不远,如下所示:

masterList=["prefix_20160817_suffix"]
containsArray=['prefix1', '2016', 'suffix']
filteredListOfFilenames=[]

for fileName in masterList:
    if all((element in fileName) for element in containsArray):
        filteredListOfFilenames.append(fileName)

我建议更深入地了解非常好的官方教程-其中包含许多有用的内容。


0

这应该适用于你。

filtered_list = []

for file_name in master_list:
    for element in contains_array:
        if element not in file_name:
            break
        filtered_list.append(file_name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接