检查子字符串的最佳方法

时间:2019-10-16 13:40:55

标签: python-3.x

我列出了所有数据库都应具有的标准作业名称,例如“ 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']

2 个答案:

答案 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)
...