过滤列表中不包含 Python 中的多个子字符串的元素
Filter elements in a list not containing multiple substrings in Python
对于文件名列表 file_names
,我尝试使用下面的代码来过滤文件名 不包含 foo
或 bar
:
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
for file_name in file_names:
for sub in subs:
if sub not in file_name:
print(file_name)
输出:
foo_data.xlsx
bar_data.xlsx
data.xlsx
data.xlsx
但是不行,应该return data.xlsx
.
同时,它适用于 包含 个案例:
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
for file_name in file_names:
for sub in subs:
if sub in file_name:
print(file_name)
输出:
foo_data.xlsx
bar_data.xlsx
是否有人可以帮助解释我的代码中的错误以及如何修复它?谢谢。
参考:
Does Python have a string 'contains' substring method?
一种正则表达式方法是形成黑名单子字符串的交替,然后使用 re.search
和列表理解来查找匹配项。
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
regex = r'(?:' + '|'.join(subs) + r')'
matches = [f for f in file_names if not re.search(regex, f)]
print(matches) # ['data.xlsx']
因为您不希望任何 sub
出现在文件名中;一种方法是用 all
:
包裹内循环
for file_name in file_names:
if all(sub not in file_name for sub in subs):
print(file_name)
输出:
data.xlsx
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
file_names1 = []
for i in range(len(file_names)):
if file_names[i].startswith(subs[0])==False and file_names[i].startswith(subs[1])==False:
file_names1.append(file_names[i])
print(file_names1)
输出:
['data.xlsx']
这应该会产生 file_names1 的结果。
对于文件名列表 file_names
,我尝试使用下面的代码来过滤文件名 不包含 foo
或 bar
:
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
for file_name in file_names:
for sub in subs:
if sub not in file_name:
print(file_name)
输出:
foo_data.xlsx
bar_data.xlsx
data.xlsx
data.xlsx
但是不行,应该return data.xlsx
.
同时,它适用于 包含 个案例:
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
for file_name in file_names:
for sub in subs:
if sub in file_name:
print(file_name)
输出:
foo_data.xlsx
bar_data.xlsx
是否有人可以帮助解释我的代码中的错误以及如何修复它?谢谢。
参考:
Does Python have a string 'contains' substring method?
一种正则表达式方法是形成黑名单子字符串的交替,然后使用 re.search
和列表理解来查找匹配项。
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
regex = r'(?:' + '|'.join(subs) + r')'
matches = [f for f in file_names if not re.search(regex, f)]
print(matches) # ['data.xlsx']
因为您不希望任何 sub
出现在文件名中;一种方法是用 all
:
for file_name in file_names:
if all(sub not in file_name for sub in subs):
print(file_name)
输出:
data.xlsx
file_names = ['foo_data.xlsx', 'bar_data.xlsx', 'data.xlsx']
subs = ['foo', 'bar']
file_names1 = []
for i in range(len(file_names)):
if file_names[i].startswith(subs[0])==False and file_names[i].startswith(subs[1])==False:
file_names1.append(file_names[i])
print(file_names1)
输出:
['data.xlsx']
这应该会产生 file_names1 的结果。