基本上输入文件是这样的:
> U51677人非组蛋白染色质蛋白HMG1(HMG1)基因,完整
Run Code Online (Sandbox Code Playgroud)cds. #some records don't have this line (see below) Length = 2575(一些文字)
> U51677人非组蛋白染色质蛋白HMG1(HMG1)基因,完整
Run Code Online (Sandbox Code Playgroud)Length = 2575(一些文字)
(等等...)
现在我写了这个来提取以>开头的行和长度的数字
import re
regex = re.compile("^(>.*)\r\n.*Length\s=\s(\d+)", re.MULTILINE)
match = regex.findall(sample_blast.read())
print match[0]
Run Code Online (Sandbox Code Playgroud)
当长度线是>线的下一行时,它适用于提取记录.
然后我尝试了re.DOTALL,它应该使任何记录匹配(.*Length),无论是否有额外的行.
regex = re.compile("^(>.*)\r\n.*(?:\r\n*.?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我尝试了re.MULTILINE和re.DOTALL而不是管道,但仍然无法正常工作.
所以问题是如何创建一个匹配记录的正则表达式并返回所需的组,而不管记录中是否有额外的行.如果有人能够在re.VERBOSE中展示这一点,那将会很好.对不起,很长的帖子,并提前感谢您的任何帮助.:)
您的问题可能是您对\r\n. 相反,尝试仅使用\n:
>>> x = """
... >U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整
...
... CD。#有些记录没有这一行(见下文)
...
...长度=2575
...(一些文字)
...
... >U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整
...
...长度=2575
...(一些文字)
...
... (ETC...)
……“”“
>>> re.search("^(>.*)\n.*(?:\n*.?)Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
<_sre.SRE_Match 对象位于 0x10c937e00>
>>> _.group(2)
‘2575’
另外,你的第一个.*太贪心了。相反,尝试使用^(>.*?)$.*?Length\s=\s(\d+)::
>>> re.findall("^(>.*?)$.*?Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
[('>U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整', '2575'), ('>U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整', '2575')]