我列出了所有数据库都应具有的标准作业名称,例如“ dbname.archivebackup.b”,“ dbname.logbackup.b”,“ dbname.fullbackup.b”,“ dbname.dailybackup.b”。
现在,我需要检查所有服务器是否都存在这4个作业。
因此,我以['ora123.archivebackup.b', 'ora123.logbackup.b', 'ora123.fullbackup.b', 'ora123.dailybackup.b']
之类的列表的形式检索现有的作业列表。
我正在尝试比较列表的任何元素中是否存在子字符串'archivebackup.b',以检查作业是否存在;其他工作也一样。下面是正确的方法吗?还是开关盒更好?我想检查该作业是否存在,如果缺少任何作业,还会返回一条消息。
for job in list:
if ("archivebackup.b" in job) or ("logbackup.b" in job) or ("fullbackup.b" in job) or ("dailybackup.b" in job):
现在,我们有了一个函数,该函数将“文件”和“作业”作为输入并检查每个作业中的匹配项。 文件= {'archivebackup.b','logbackup.b','fullbackup.b','dailybackup.b'} jobs = ['oracledb1.archivebackup.b','oracledb1.logbackup.b','oracledb1.fullbackup.b','oracledb1.dailybackup.b'] 我们如何在函数中添加另一个检查,以在下面的一组数据库中进行迭代,并为每个数据库检查'dbanme'和'files'的字符串组合。 dbname = ['ora123','ora456']
答案 0 :(得分:1)
Pythonic的实现方式是这样的:
substrings = ['archivebackup.b', 'logbackup.b', 'fullbackup.b', 'dailybackup.b']
for job in list:
if any(sub in job for sub in substrings):
# at least one of the sub-strings matches the name
pass
答案 1 :(得分:0)
另一个答案效率不高,因为它会在job
中搜索您要查找的每个子字符串。而是使用regex
查找所需内容:
import re
jobs = ['The file archivebackup.b is not here']
files = {'archivebackup.b', 'logbackup.b', 'fullbackup.b', 'dailybackup.b'}
FIND_FILE = re.compile('|'.join(s for s in files))
matches = set()
for job in jobs: # From you code
match = FIND_FILE.search(job)
if match:
print(match.group(0), "found") # archivebackup.b found
matches.add(match.group(0))
print("Missing:", files - matches)
请注意,如果每个作业匹配多个文件,则应使用findall
而不是search
:
...
match = FIND_FILE.findall(job)
if match:
print(match, "found") # archivebackup.b found
for ele in match:
matches.add(ele)
...