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

2024-05-15 23:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上输入文件如下:

>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里就好了。很抱歉给你发了这么长的信,谢谢你的帮助。:)


Tags: re记录somelengthregexmultilinehumannon
2条回答

你的问题可能是你使用了\r\n。相反,请尝试仅使用\n

>>> x = """
... >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...)
... """
>>> re.search("^(>.*)\n.*(?:\n*.?)Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
<_sre.SRE_Match object at 0x10c937e00>
>>> _.group(2)
'2575'

另外,你的第一个.*太贪婪了。相反,请尝试使用:^(>.*?)$.*?Length\s=\s(\d+)

>>> re.findall("^(>.*?)$.*?Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
[('>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete', '2575'), ('>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete', '2575')]

试试这个正则表达式:

"^(>[^\r\n]*).*?Length\s=\s(\d+)"

同时设置两个选项(使用管道符号)。

第一个捕获组将匹配到>之后的第一个换行符(与操作系统无关)。然后.*?将匹配任何字符,直到遇到第一个Length。剩下的和你第一次尝试的一样。

前一次尝试的问题似乎是,您使用的.*可以匹配任何东西,同时又贪婪(因此它将尽可能地消耗,包括下面的Length = 2575)。

相关问题 更多 >