Python 如何仅输出唯一的基因id';s
我正在使用Python 如何仅输出唯一的基因id';s,python,fasta,nano,Python,Fasta,Nano,我正在使用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 mylist
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
mylist = re.match(r"H149xcV_\w+_\w+_\w+", gene_id)
print (">"+list.group(0))
并提供以下输出:
>H149xcV_Fge342_r3_h2_d1
>H149xcV_bTr423_r3_h2_d1
>H149xcV_kN893_r3_h2_d1
>H149xcV_DNp021_r3_h2_d1
>H149xcV_JEP3324_r3_h2_d1
>H149xcV_JEP3324_r3_h2_d1
>H149xcV_JEP3324_r3_h2_d1
>H149xcV_JEP3324_r3_h2_d1
>H149xcV_SRt424234_r3_h2_d1
>H149xcV_SRt424234_r3_h2_d1
>H149xcV_SRt424234_r3_h2_d1
>H149xcV_SRt424234_r3_h2_d1
我如何更改命令,使其为我提供唯一的:
>H149xcV_Fge342_r3_h2
>H149xcV_bTr423_r3_h2
>H149xcV_kN893_r3_h2
>H149xcV_DNp021_r3_h2
>H149xcV_JEP3324_r3_h2
>H149xcV_SRt424234_r3_h2
您可以显式地使用类,因为
\w+
将匹配[a-zA-Z0-9],所以即使您有多个\w+
,也没关系
H149xcV_[a-zA-Z0-9]+_[a-zA-Z0-9]+_[a-zA-Z0-9]+
在开发正则表达式时尝试使用正则表达式,这会有很大帮助
一个小聪明的方法:
(H149xcV(_[a-zA-z0-9]+){3})
( start of group 1
H149xcV match literal text
( start of sub-group 1
_ match underscore
[a-zA-Z0-9] word with digits
+ more than one occurrence
) end of sub-group 1
{3} should repeat 3 times
) end of group 1
您可以使用捕获组并在替换中使用该组 为了防止不必要的回溯,您可以使用否定字符类
[^\W_]+
(H149xcV_[^\W_]+_[^\W_]+)_[^\W_]+
如果您只对正则表达式匹配的一部分感兴趣,请使用组将该部分挑出:
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(1))
这会让你得到你需要的输出
您还询问了如何确保输出中没有重复项。要做到这一点,你需要保存一份你已经写过的东西的记录,这意味着它们都会被存储在内存中——如果你这样做的话,你也可以在内存中建立列表,完成后再写。这是假设您的数据集不会太大以至于无法放入内存
解决方案如下所示:
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
# by collecting results in a set, they are guaranteed to be unique
result = set()
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
m = re.match(r"(H149xcV_\w+_\w+)_\w+", gene_id)
if m.group(1) not in result:
print(">"+m.group(1))
result.add(m.group(1))
另一种方法是构建
result
并在完成后将其打印出来,但这有一个缺点,即结果不再与原始结果保持相同的顺序,尽管速度会快一点(因为您不再需要检查每行是否m.group(1)不在result
。Hi@Thefourthbird,输出成功了!现在的问题是,我正在获取相同基因的副本,我尝试使用uniq
仅获取唯一的基因,但它似乎不起作用?@AlphaQueUp将您的值添加到a中我尝试过,但我仍然不断获得副本。我不确定我是否正确编写了命令。@AlphaQueUp还请注意,您已将列表重命名为mylist。请看这里的一个例子Hi@Thefourthbird抱歉,我只是在集成到原始命令时遇到了问题,它仍然无法工作。有超过20000个基因id,我需要手动将我的值添加到集合中吗?是的,非常感谢@Grismar我怎么能改变我只获得唯一的基因id,现在我收到的是同一个基因的副本。这是有道理的!谢谢我应该在问题中提到,但有没有办法只获得独特的基因而不复制?我尝试在命令行上使用sort
|uniq
,但它似乎不起作用@KamranPervaiz@AlphaQueUp您可以使用re.findall
获取列表,并使用set(mylist)
转换列表。看看这个答案
from Bio import SeqIO
import sys
import re
fasta_file = (sys.argv[1])
# by collecting results in a set, they are guaranteed to be unique
result = set()
for myfile in SeqIO.parse(fasta_file, "fasta"):
if len(myfile) > 250:
gene_id = myfile.id
m = re.match(r"(H149xcV_\w+_\w+)_\w+", gene_id)
if m.group(1) not in result:
print(">"+m.group(1))
result.add(m.group(1))