基本上,输入文件如下所示:
U51677人非组蛋白染色质蛋白HMG1 (HMG1)基因 cds。#有些记录没有这一行(见下文)长度= 2575 (一些案文) U51677人非组蛋白染色质蛋白HMG1 (HMG1)基因 长度= 2575 (一些案文) (等等)
现在我写了这个来提取以>开头的行和长度的数字
import re
regex = re.compile("^(>.*)\r\n.*Length\s=\s(\d+)", re.MULTILINE)
match = regex.findall(sample_blast.read())
print match[0]当长度行是>行的下一行时,它可以很好地提取记录。
然后,我尝试了re.DOTALL,它应该进行任何记录匹配(.*Length),而不管是否有额外的行。
regex = re.compile("^(>.*)\r\n.*(?:\r\n*.?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)但不起作用。我尝试了re.MULTILINE和re.DOTALL,而不是管道,但仍然无法工作。
因此,问题是如何创建与记录匹配的正则表达式并返回所需的组,而不管记录中是否有额外的行。如果有人也能在re.VERBOSE中展示这一点,那就太好了。很抱歉给你这么长的邮件,谢谢你提前提供帮助。:)
发布于 2012-10-28 17:01:53
试试这个正则表达式:
"^(>[^\r\n]*).*?Length\s=\s(\d+)"设置了这两个选项(使用管道符号)。
第一个捕获组将匹配所有内容,直到> (独立于您的操作系统)之后的第一行中断。然后,.*?将匹配任何字符,直到遇到第一次 Length为止。剩下的和你的第一次尝试是一样的。
前一次尝试的问题似乎是,您使用的.*可以匹配任何东西,同时又很贪婪(因此它将消耗尽可能多的资源,包括下面的Length = 2575 )。
发布于 2022-05-23 03:47:51
sample_blast = """
>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete
cds. #some records don't have this line (see below)
Length = 2575
(some text)
>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete
Length = 2575
(some text)
(etc...)
"""
import re
regex = re.compile("^>(.*?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)
match = regex.findall(sample_blast)
print(match)[("U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete\n\n cds. #some records don't have this line (see below)\n\n ", '2575'),
('U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete\n\n ', '2575')]https://stackoverflow.com/questions/13110907
复制相似问题