如何编写正则表达式匹配FASTA序列第564位为V/I/E的氨基酸序列?
问题描述
需要从FASTA文件中筛选出第564位氨基酸为V、I或E的序列,当前使用正则匹配始终无结果,但确认存在符合条件的序列。
现有代码
with open("/Users/adia/Downloads/FGFR_fusion.fasta",'r') as fasta: test = fasta.read() test = test.split(">") del test[0] out = open("/Users/adia/Desktop/PSB HW_6.txt", 'w') for x in test: if 'fibroblast growth factor receptor 1 isoform' in x: out.write(x) with open("/Users/adia/Desktop/PSB HW_6.txt", 'r') as filtered: test2 = filtered.read() out = open("/Users/adia/Desktop/564ID.txt", 'w') AA564 = re.compile('^M.{562}[IVE]') matches = re.finditer(AA564,test2) found = [] for match in matches: found.append(match.group(0)) print(f"Found {match.group(0)} at position {match.start()}.\n") if found == []: print("No match found.")
运行结果:No match found.
已尝试的正则表达式变体
re.compile('M.{562}[IVE]')re.compile('^M.{562}[IVE]')re.compile('^M.{562}[IVE]',re.M)re.compile('^M.{562}[IVE]',re.DOTALL)re.compile('M.{562}[IVE].*')re.compile('^M.{562}[IVE].*')re.compile('^M[GALMFWKQESOVICYHRNDT]{562}[IVE]')re.compile('M[GALMFWKQESOVICYHRNDT]{562}[IVE]')re.compile('^M[A-Z]{562}[IVE]')
怀疑方向
怀疑问题出在文件写入后的格式,但读取后为字符串格式,无法进一步编辑适配正则,寻求解决思路。
解决思路
1. 先处理FASTA序列的换行问题
FASTA的序列部分通常会被换行拆分,不是连续的单行字符串。你的正则默认序列是连续字符,但实际读取后包含的换行符会被.匹配,打乱第564位的计数逻辑。必须先把序列中的所有换行符去掉,合并成纯氨基酸字符串。
2. 拆分FASTA条目,分离头部和序列
当前代码把头部注释和序列混在一起匹配,正则会把头部的字符也算入计数,完全偏离目标。正确做法是:
- 对每个FASTA条目,拆分出头部行和序列部分
- 只针对纯序列进行位置判断
3. 用直接索引替代正则(更可靠)
正则处理长序列容易出现边界错误,直接通过字符串索引判断更直观:
- 序列第1位对应索引0,第564位对应索引563
- 检查
sequence[563]是否属于{'V','I','E'}
修正后的代码示例
# 直接处理原始FASTA,避免中间文件引入格式问题 with open("/Users/adia/Downloads/FGFR_fusion.fasta", 'r') as fasta, open("/Users/adia/Desktop/564ID.txt", 'w') as out: entries = fasta.read().split(">") for entry in entries[1:]: # 跳过拆分后第一个空元素 if 'fibroblast growth factor receptor 1 isoform' not in entry: continue # 拆分头部和序列行 lines = entry.strip().split('\n') header = lines[0] # 合并所有序列行,去除换行符 sequence = ''.join(lines[1:]).replace('\n', '') # 先判断序列长度足够,再检查目标位置氨基酸 if len(sequence) >= 564 and sequence[563] in {'V', 'I', 'E'}: # 写入完整的FASTA条目 out.write(f">{entry}\n") print(f"匹配到序列:{header}")
额外排查点
- 确认序列是否都以
M开头?如果有非M起始的序列,正则的^M会直接跳过 - 检查序列长度:如果序列不足564位,索引会报错,必须先做长度判断
- 中间文件
PSB HW_6.txt可能引入多余空行或格式混乱,直接处理原始FASTA更稳妥
内容的提问来源于stack exchange,提问作者axr
相关产品推荐
相关产品推荐

