You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:31:03