【问题标题】:Receiving NameError - how to fix?接收 NameError - 如何修复?
【发布时间】:2020-11-23 18:01:22
【问题描述】:

我正在处理一个项目,但我在nano 中编写的以下代码存在问题:

from Bio import SeqIO
import sys
import re 


    fasta_file = (sys.argv[1])
    for myfile in SeqIO.parse(fasta_file, "fasta"):
      if len(myfile) > 250:
       gene_id = myfile.id
       list = re.match('H149xcV\_\w+\_\w+\_\w+', gene_id)
       print (">"+list.group(1)) 

这是我在command-line 上执行命令时收到的错误:

File "mpo.py", line 7, in <module>
    gene_id = myfile.id
NameError: name 'myfile' is not defined

我有一个 fasta 格式的文件

>H149xcV_Fge342_r3_h2_d1 len=210 path=[0:0-206]
ACTATACATGAGGAGAACATAGAACAAAAATGGGACCATAGATATATAACAATAGAAGATATAGAGAACACAATAGACAACTTATTAGGAAAGAGGTGTGTCGTCATGGAGCTGATGTTCGAGGATACTTTGCATGGTCATTCTTGGATAATTTTGAGTGGGCTATGGGATACACCAAGAGGTTTGGCATTGTTTATGTTGATTATAAGAACGGGC

 >H149xcV_ytR1oP_r3_h2_d1 len=306 path=[0:0-207]
    ATTAGAGTCTGAGAGAGTCTTGATTTGTCGTCGTCGAGAAATATAGGAGATCTGATTAGAGGAGAGAGCGGCCTAGGCGATGCGCGATATAGCGCTATATAGGCCTAGAGGAGAGTCTCTCTCTTTTAGAAGAGATAATATATATATATATATGGCTCTCCGGCGGGGCCGCGCGAGAGCTCGATCGATCGATATTAGCTGTACGATGCTAGCTAGCTTATATTCGATCGATTATAGCTTAGATCTCTCTCTAAAGGTCGATATCGCTTATGCGCGCGTATATCG

我想重新格式化我的文件,以便它只为我提供唯一的基因 ID,并且只输出那些长度大于 250 bp 的基因 ID。

我希望我想要的输出如下所示:

>H149xcV_Fge342_r3_h2
>H149xcV_ytR1oP_r3_h2
>H149xcV_DPN78333_r3_h2
>H149xcV_AgV472_r3_h2
>H149xcV_DNP733_r3_h2

【问题讨论】:

  • 您的正则表达式是否需要双引号? re.match("H149xcV\_\w+\_\w+\_\w+")
  • re.match 将字符串作为参数。 (不是 Python 解析器)将其解析为正则表达式。
  • @rhavelka 我试过这样做,但后来收到这个 TypeError: match() missing 1 required positional argument: 'string'
  • @chepner 那么我需要使用 re.search 吗?
  • @AlphaQueUp 看着docs 你需要一个模式和一个字符串。所以你需要像re.match(""H149xcV\_\w+\_\w+\_\w+", myFile)这样的东西

标签: python regex shell bioinformatics fasta


【解决方案1】:

正如您问题后的 cmets 中所建议的,要匹配的参数应该是一个字符串。我要补充的一件事是 python3 有一个用于正则表达式的 r"" 字符串分隔符。你的代码变成这样:

from Bio import SeqIO
import sys
import re 


    fasta_file = (sys.argv[1])
    for myfile in SeqIO.parse(fasta_file, "fasta"):
      if len(myfile) > 250:
       gene_id = myfile.id
       list = re.match(r"H149xcV_\w+_\w+_\w+", gene_id)
       print (">"+list.group(0)) 

下划线 _ 不是特殊的正则表达式字符(我记得),因此不需要转义。

match() 函数接受一个正则表达式和您正在搜索的字符串(所以我添加了gene_id)。最后,您要输出group(0)。 group(0) 表示整个匹配。 group(1) 来自第一个捕获括号(你没有)所以坚持使用 group(0)。

【讨论】:

  • 嗨@Mark,我将如何更改正则表达式以便它只为我提供&gt;H149xcV_Fge342_r3_h2 而不是&gt;H149xcV_Fge342_r3_h2_d1。我不喜欢由d1 组成的最后部分。所以基本上,我怎样才能格式化它,所以它只提供这个&gt;H149xcV_Fge342_r3_h2
  • 正则表达式中的 \w 表示“任何单词字符”。这本质上是指字母和数字(尽管我确信我在技术上是不正确的)。 \w+ 表示 1 个或多个字母或数字。正则表达式中的下划线 _ 告诉解析器查找下划线(文字匹配)。因此,如果您希望正则表达式不包含 '_d1' ,请省略字符串中的最后 4 个字符。具体来说,请改用 r"H149xcV_\w+_\w+"。
【解决方案2】:

使用EMBOSS 包中的infoseq 实用程序,并将输出(具有序列ID 和长度的表)通过您选择的脚本语言的单行进行管道传输。在这里,为了简单起见,我使用 Perl:

cat input.fasta | \
    infoseq -auto -only -name -length stdin | \
    perl -lane 'my ($name, $length) = @F; if ( !$seen{$name}++ && $length > 250 ) { print ">$name"; }' > output.fasta

安装EMBOSS,例如使用conda

conda create --name emboss emboss

【讨论】:

  • 嗨@TimurShtatland 不幸的是,我不允许使用任何其他实用程序。
猜你喜欢
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2019-11-27
  • 2019-11-22
  • 2020-11-28
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多