使用re.MULTILINE和re.DOTALL一起使用python

bio*_*ant 7 python regex

基本上输入文件是这样的:

> U51677人非组蛋白染色质蛋白HMG1(HMG1)基因,完整

       cds. #some records don't have this line (see below)

       Length = 2575
Run Code Online (Sandbox Code Playgroud)

(一些文字)

> U51677人非组蛋白染色质蛋白HMG1(HMG1)基因,完整

       Length = 2575
Run Code Online (Sandbox Code Playgroud)

(一些文字)

(等等...)

现在我写了这个来提取以>开头的行和长度的数字

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中展示这一点,那将会很好.对不起,很长的帖子,并提前感谢您的任何帮助.:)

Dav*_*ver 4

您的问题可能是您对\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')]