如何通过循环优化CIGAR处理函数中重复的正则表达式提取步骤
CIGAR字符串处理函数优化方案
优化思路
你原来的代码里8行正则匹配逻辑高度重复,仅匹配的操作符不同,同时你写的伪代码存在问题:将未定义的变量和字符串混在了acronyms列表里。我们可以通过字典存储操作符与对应结果的映射,结合循环批量完成匹配,完全兼容原有逻辑的同时大幅减少冗余代码。
优化后完整代码
import re import itertools # 示例输入: X = "21M4D35M1I84M9S15=92X" def CIGAR(X): # 定义所有CIGAR操作符和对应的描述,统一管理 op_config = [ ("M", "Exact Matches"), ("D", "Deletions"), ("N", "Skipped region from the reference"), ("I", "Insertions"), ("S", "Soft Clippings"), ("H", "Hard Clippings"), ("X", "sequence match"), ("=", "sequence mismatch"), ] # 用字典存储每个操作符对应的数值列表 cigar_data = {} for op, _ in op_config: # 动态拼接正则,re.escape处理特殊字符,兼容性更强 matches = re.findall(rf"(\d+){re.escape(op)}", X) cigar_data[op] = list(map(int, matches)) # 原有逻辑保持不变,仅从字典取对应列表即可,和之前的变量完全兼容 m, d, n, i, s, h, x, equals = cigar_data["M"], cigar_data["D"], cigar_data["N"], cigar_data["I"], cigar_data["S"], cigar_data["H"], cigar_data["X"], cigar_data["="] query = m + i + s + equals + x # 按samtools规则,这些操作会沿查询序列步进 reference = m + d + n + equals + x print(sum(m), "Exact Matches\n", sum(d), "Deletions\n", sum(n), "Skipped region from the reference\n", sum(i), "Insertions\n", sum(s), "Soft Clippings\n", sum(h), "Hard Clippings\n", sum(x), "sequence match\n", sum(equals), "sequence mismatch\n", sum(query), "bases in query sequence\n", sum(reference), "bases in the reference sequence")
额外可选优化(按需选择)
如果想进一步简化打印逻辑,也可以循环op_config批量打印统计结果,不需要手动写每一行sum:
# 替换原来的print部分即可 for op, desc in op_config: print(sum(cigar_data[op]), desc) print(sum(query), "bases in query sequence") print(sum(reference), "bases in the reference sequence")
内容的提问来源于stack exchange,提问作者KLM117
相关产品推荐
相关产品推荐

