Simple DNA pattern matching:为未匹配模式添加提示的实现方法
多模式匹配新增未匹配提示实现方案
核心逻辑位置说明
判断单个模式是否未匹配的逻辑,必须放在单个pattern对应的内层滑动窗口遍历结束之后、开始遍历下一个pattern之前:
- 不能放在内层匹配循环内部:不然只要某一个位置不匹配就会误报,还没遍历完所有可能位置就下结论
- 不能放在所有pattern遍历完的最末尾:没法区分具体是哪个pattern没匹配到
- 这个节点刚好完成了当前pattern在全文本的所有位置检查,判断结果完全准确
具体修改步骤
- 每轮处理单个pattern前,先初始化布尔标记
found = False,用来记录当前pattern是否存在匹配 - 内层匹配循环中,只要找到一处匹配,除了记录匹配位置,同步把
found标记改为True(如果需要收集该pattern的所有匹配位置,不需要提前break,继续遍历完所有窗口即可) - 单个pattern的所有窗口遍历完成后,立刻检查
found标记,如果值为False,直接输出该pattern对应的未匹配提示
修改后可运行代码
text = "CTGATTCC" patterns = ("ATT", "CT", "TTT") match_positions = [] for p in patterns: p_length = len(p) found = False # 滑动窗口遍历所有可能匹配位置 for i in range(0, len(text) - p_length + 1): if text[i:i+p_length] == p: match_positions.append(i + 1) # 存储1起始的匹配位置 found = True # 当前pattern全量检查完成后判断匹配状态 if not found: print(f"Pattern '{p}' is not found") print("Positions:", match_positions)
运行效果说明
用示例参数运行时,模式"TTT"在文本中无匹配,会先输出Pattern 'TTT' is not found,最终输出的匹配位置列表为[4, 1],分别对应"ATT"在位置4、"CT"在位置1的匹配结果。
小提示:原代码使用set作为变量名会覆盖Python内置的集合类型,属于不规范写法,修改时替换为语义明确的变量名即可避免潜在问题。
内容的提问来源于stack exchange,提问作者aycee
相关产品推荐
相关产品推荐

