Python正则提取DNA序列最长ORF结果不符合预期原因求解
问题原因分析
re.findall默认仅返回非重叠的匹配结果,每匹配到一个子串后,会直接从该子串结束的下一个位置继续向后扫描,不会回头查找重叠区域的匹配项。如果你预期的长ORF和前面更短的ORF存在序列重叠,那么长ORF根本不会被加入匹配结果列表,自然无法被max函数选中。- 你当前的正则逻辑只会匹配到距离起始密码子最近的终止密码子。
(?:(?!TAA|TAG|TGA)...)*的运行逻辑是,每次匹配3个碱基前,先检查当前位置起始的3个碱基是否为终止密码子,一旦遇到终止密码子就立刻停止循环匹配,因此每个ATG起始位点只会对应一个最短的匹配结果,不会延伸到更远的终止密码子。你认为的长ORF大概率在同阅读框下存在你未注意到的中间终止密码子,导致正则提前终止匹配,得到的短片段在长度排序中被其他ATG起始的更长片段覆盖。
修正方案
如果需要捕获所有可能的重叠ORF,再从中筛选最长的,可以用正向零宽断言包裹整个匹配规则,让正则扫描序列的每一个位置尝试匹配,不会跳过重叠区域:
import re line = "CTGGCGACCGGAGGGCGACAACGGCGGCTGGGATGGTTAGTACTCGGGGCCCAGGCGGCCATGGGAGAGGTGCAGCTGTTGGAGTCTGGGGGAGGCCTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGCGCAGCCTCTGGATTCACTTTTGAGCAATATGATATGCGCTGGGTCCGCCAGGCTCCTGGGAAGGGGCTGGAGTGGGTCAGTGCGATCAGCCGCGAGGGCAGAGCCACGTATTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACTCCAAGAACACACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGCGCTAGAGACTTGGGTGACTATTGGGGCCAAGGAACCCTGGTCACCGTCTCCTCAGGTGGCGGTGGATCGGGCGGTGGTGGATCTGGAGGAGGTGGCTCGGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTCTGGAGATAAGTTGGGACATACGTATACCTCCTGGTACCAACAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATCATGATAATAAGCGCCCTTCAGGGGTCCCTTCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAGCCTGAAGATTTTGCAACTTATTACTGCTCTACTAGATCAAGCAAGGGCAATCCACACGTCCTGTTCGGCCAAGGACCAAAGTGGAGATCAAAAGGCCCGGGAGGCCAACACCATCACCACCATCATGGCGCATATCCGTATGATGTGCCGGACTATGCTTCTTAGCCGAAACTGTTGAAAGTTGTTTAGCAAAACCTCATACAGAAAATTCATTTACTAACGTCTGGAAGACGACAAACTTTAGATCGTTACGCTAACTATGAGGCTGTCTGTGGATGCTACAGCGTTGTGGTTTGTACTGTGACGAAACTCATGTTACGGTACATGGTTCTATTGGCTGCTATCCTGAAATGAAGTGTGCTCTGAAGGTGGCCGTTCTGAGGGTGGCGTTCTGAAGTGACGTACTTAAACATCTGAGATACGTGATATACCTATTTCCGGGGCTATATCTTATATATAAACCCTCTCTGACG" # 正向零宽断言捕获所有重叠ORF all_orfs = re.findall(r'(?=(ATG(?:(?!TAA|TAG|TGA)...)*(?:TAA|TAG|TGA)))', line) if all_orfs: longest_orf = max(all_orfs, key=len) print(longest_orf)
运行上述代码即可得到你预期的最长ORF。
内容的提问来源于stack exchange,提问作者Dennis Sun
相关产品推荐
相关产品推荐

