Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在字符串中搜索列表中的字符子字符串_Python_List_File - Fatal编程技术网

Python 在字符串中搜索列表中的字符子字符串

Python 在字符串中搜索列表中的字符子字符串,python,list,file,Python,List,File,sp | P46531 | NOTC1 | U人类神经原性位点notch同源蛋白1 OS=智人GN=NOTCH1 PE=1 SV=4 mppllaplclallp 我有一个fasta文件,我想在文件中搜索氨基酸序列的开头。大概是 aminoacids = ['A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y'] for filename in file_list: with open

sp | P46531 | NOTC1 | U人类神经原性位点notch同源蛋白1 OS=智人GN=NOTCH1 PE=1 SV=4 mppllaplclallp

我有一个fasta文件,我想在文件中搜索氨基酸序列的开头。大概是

aminoacids = ['A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y']
for filename in file_list:
    with open(filename,'r') as fh:
        while True:
        char = fh.read(1)
        if char.upper() in aminoacids:
            #look for the 4 characters directly after it
但是,如果在氨基酸列表中发现一个字符,并且它旁边的四个字符也在列表中,那么将生成一个字符串,从该字符开始,一直到不再有字符为止。
例如,我希望遍历文件以查找字符。如果找到M,那么我想查找接下来的四个字符(PPLL)。如果接下来的四个字符是氨基酸,那么我想创建一个以M开头,一直到文件末尾的字符串。

您可以将文件作为单个字符串读取,然后搜索正则表达式:

regex = re.compile("[%s]{5}.*" % "".join(aminoacids))

with open(filename, 'r') as fh:
    s = fh.read()
    aa_sequence = regex.findall(s)
    if len(aa_sequence) > 0:
        # an amino acid sequence was found
        print aa_sequence[0]
这是因为构造的正则表达式是:

[ACDEFGHIKLMNPQRSTVWY]{5}.*
意思是“这些字符中的5个,后跟任何字符。”

请注意,如果您的氨基酸字符串可能跨越多行,则需要先删除换行符,包括:

s = fh.read().replace('\n', '')
# or
s = "".join(s.readLines())

你要找的4个字符是在fasta文件中,还是你的意思是如果“A”然后打印“A”“C”“D”“E”?@Andy Wong我的错,我会修正这个措辞。我是说在档案里。我正在文件中查找字符。文件有多大?在开始时将整个文件读入内存是否合理?(你可能不会的唯一原因是,如果你预计氨基酸序列非常接近一个非常大的文件的末尾)@DavidRobinson该文件目前还不是太大。我只处理相对较小的文件。后来我将其转换为字符串,但我想先搜索该文件。如果必须的话,我可以先把它转换成字符串。这会更好吗?仅供参考,但每个字母都是有效的氨基酸单字母代码,因为有一些字母表示“呃,不是这个就是那个,但我们不确定它们的化学成分是否相似”。B是asn/asp。Z是glu/gln。X是未知的。J是leu/ile。u是硒代半胱氨酸,O是吡咯赖氨酸
aa_sequence=regex.findall(s)[0]
为此,我得到一个列表索引超出范围错误。。。?我完全忘记了python有类似perl的正则表达式,所以谢谢你。@varda1316啊:这意味着该文件没有氨基酸序列。请参阅“编辑”以获取测试此功能的版本。我认为这不起作用,因为a)我的文件一开始不是空的-有一个氨基酸序列B)现在它只是说,当我打印
len(aa_序列)
时,文件中只有一个字符。。。?我想也许我必须把它放在一个循环中才能工作?@varda1316它不是说文件中只有一个字符,而是说它找到了一个匹配项。打印
aa_序列[0]
,您将看到匹配的字符串.Ohh起作用。关于我之前遇到的列表索引超出范围错误,我实际上有一个只有小写字母的文件,这就是问题所在。所以基本上aa_序列是一个列表,当我打印长度时,它告诉我列表中有一个元素?