首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用re.search和group()函数从文件中提取蛋白质名称

如何使用re.search和group()函数从文件中提取蛋白质名称
EN

Stack Overflow用户
提问于 2019-11-01 19:43:14
回答 2查看 83关注 0票数 0

我试图从一个文件中提取出所有的蛋白质名称,并将其保存为一个列表,但是我继续获得一个空列表作为我的输出。下面是文件中几行代码的示例。请注意,这个文件基本上是不同物种的蛋白质,我需要提取由物种的OS=名称表示的名称。

代码语言:javascript
复制
sp|Q8C025|CHPT1_MOUSE Cholinephosphotransferase 1 OS=Mus musculus GN=Chpt1 PE=1 SV=1
sp|Q9Y6K0|CEPT1_HUMAN Choline/ethanolaminephosphotransferase 1 OS=Homo sapiens GN=CEPT1 PE=1 SV=1
sp|O14735|CDIPT_HUMAN CDP-diacylglycerol--inositol 3-phosphatidyltransferase OS=Homo sapiens GN=CDIPT PE=1 SV=1
sp|Q8WUD6|CHPT1_HUMAN Cholinephosphotransferase 1 OS=Homo sapiens GN=CHPT1 PE=1 SV=1
sp|P17898|CPT1_YEAST Cholinephosphotransferase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=CPT1 PE=1 SV=3
sp|O80952|PGPS1_ARATH CDP-diacylglycerol--glycerol-3-phosphate 3-phosphatidyltransferase 1, chloroplastic OS=Arabidopsis thaliana GN=PGPS1 PE=1 SV=1
sp|P22140|EPT1_YEAST Choline/ethanolaminephosphotransferase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=EPT1 PE=1 SV=2

,在上面的例子中的物种名称,musculus,家鼠。所有的序列名称都与“OS=”相似,表示物种名称的开头,其次是属和用空格分隔的物种。

贝娄是这个问题的说明:

  1. 通过文件protein_names.txt提取所有物种的名称。

  1. 将属名和种名组合成一个单独的字符串,以空格分隔(例如“musculus"),并确保在名称的开头或结尾删除任何空格。

  1. 许多种都是由一种以上的蛋白质代表。您可以包括或排除冗余名称--我不在乎

到目前为止,这就是我所编码的:

代码语言:javascript
复制
name_file= open("protein_names.txt")
name_file_contents = name_file.readlines()
name_file_2=str(name_file_contents)
protein = r"^OS=(.\n.)$"
search= re.search(protein,name_file_2)
species_names= []

for protein_names in name_file:
    if search:
        search.group()
        species_names.append(search.group())
print(species_names)

收到一份空的名单,不知道我哪里出了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-02 01:40:17

有很多不同的方法来实现这一点,我将继续努力寻找一个更好的方法。其他用户已经就您的代码给出了建议,所以我现在没有任何要添加的内容。

现在,这里有一个简单的解决方案。它懒洋洋地读取文件,所以内存的使用不应该是一个问题。

代码语言:javascript
复制
import re


org_name_regex = re.compile(r'(?<=OS=)[a-zA-Z0-9 ()/]+(?= )')


def get_file_org_names(file_path, unique=True):
    with open(file_path, 'r') as in_file:
        match_objs = (org_name_regex.search(curr_line) for curr_line in in_file)
        names_lst = (item.group() for item in match_objs if item is not None)
        if unique:
            return set(names_lst)
        else:
            return list(names_lst)


org_names_unq = set(get_file_org_names(protein_file_path, True))
票数 0
EN

Stack Overflow用户

发布于 2019-11-01 21:39:12

迭代每一行并在re.search中使用正则表达式re.search。检查是否匹配,如果匹配,则使用group(1)将组括号中的组添加到物种集合中:

代码语言:javascript
复制
import re

species = set()

with open("protein_names.txt") as protein_file:
    for line in protein_file:
        result = re.search("OS=\\s*(\\S+ \\S+)", line)
        if result is not None:
            species.add(result.group(1))

print(species)

为了好玩,这里有一个在一行中完成大部分工作的版本:

代码语言:javascript
复制
import re

species = None
with open("protein_names.txt") as protein_file:
    species = set(result.group(1) for result in re.finditer("OS=\\s*(\\S+ \\S+)", protein_file.read()))

print(species)

而且为了更多的乐趣,另一条~-一行程序迭代文件,而不是一次全部加载它:

代码语言:javascript
复制
import re, itertools

species = None
with open("protein_names.txt") as protein_file:
    species = set(result.group(1) for result in itertools.chain(
            *(re.finditer("OS=\\s*(\\S+ \\S+)", line) for line in protein_file)
            ))

print(species)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58665022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档