基本上输入文件如下:
>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("^(>.*)\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代替pipe,但仍然不起作用。
所以问题是如何创建一个匹配记录的regex并返回所需的组,而不管记录中是否有多余的行。如果有人能把这个也显示在re.VERBOSE里就好了。很抱歉给你发了这么长的信,谢谢你的帮助。:)
你的问题可能是你使用了
\r\n
。相反,请尝试仅使用\n
:另外,你的第一个
.*
太贪婪了。相反,请尝试使用:^(>.*?)$.*?Length\s=\s(\d+)
:试试这个正则表达式:
同时设置两个选项(使用管道符号)。
第一个捕获组将匹配到
>
之后的第一个换行符(与操作系统无关)。然后.*?
将匹配任何字符,直到遇到第一个Length
。剩下的和你第一次尝试的一样。前一次尝试的问题似乎是,您使用的
.*
可以匹配任何东西,同时又贪婪(因此它将尽可能地消耗,包括下面的Length = 2575
)。相关问题 更多 >
编程相关推荐