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

新手上路,请多包涵

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

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

>        cds. #some records don't have this line (see below)
>
>        Length = 2575
>
> ```
>
> (一些文字)
>
> >U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整
>
> ```
>        Length = 2575
>
> ```
>
> (一些文字)
>
> (ETC...)

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

import re regex = re.compile(“^(>.*)\r\n.*Length\s=\s(\d+)”, re.MULTILINE) match = regex.findall(sample_blast.read())

print match[0]


当 Length 行是 > 行的下一行时,它可以很好地提取记录。

然后我尝试了 re.DOTALL,它应该使任何记录匹配 (.\*Length),无论是否有额外的行。

regex = re.compile(“^(>.)\r\n.(?:\r\n*.?)Length\s=\s(\d+)”, re.MULTILINE|re.DOTALL)

”`

但它不起作用。我尝试了 re.MULTILINE 和 re.DOTALL 而不是管道,但仍然不起作用。

所以问题是如何创建一个匹配记录的正则表达式并返回所需的组,而不管记录中是否有额外的行。如果有人也可以在 re.VERBOSE 中展示这一点,那就太好了。很抱歉发了这么长的帖子,感谢您提前提供的帮助。 :)

原文由 noqa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
1 个回答

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

>>> x = """
... >U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整
...
... CD。 #有些记录没有这一行(见下文)
...
... 长度 = 2575
...(一些文字)
...
... >U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整
...
... 长度 = 2575
...(一些文字)
...
... (ETC...)
...“”“
>>> re.search("^(>.*)\n.*(?:\n*.?)长度\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
<_sre.SRE_Match object at 0x10c937e00>
>>> _.组(2)
'2575'

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

>>> re.findall("^(>.*?)$.*?长度\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
[('>U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整', '2575'), ('>U51677 人类非组蛋白染色质蛋白 HMG1 (HMG1) 基因,完整', '2575')]

原文由 David Wolever 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题