首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >re.MULTILINE和re.DOTALL的结合使用

re.MULTILINE和re.DOTALL的结合使用
EN

Stack Overflow用户
提问于 2012-10-28 16:52:57
回答 2查看 42K关注 0票数 9

基本上,输入文件如下所示:

U51677人非组蛋白染色质蛋白HMG1 (HMG1)基因 cds。#有些记录没有这一行(见下文)长度= 2575 (一些案文) U51677人非组蛋白染色质蛋白HMG1 (HMG1)基因 长度= 2575 (一些案文) (等等)

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

代码语言:javascript
复制
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),而不管是否有额外的行。

代码语言:javascript
复制
regex = re.compile("^(>.*)\r\n.*(?:\r\n*.?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-10-28 17:01:53

试试这个正则表达式:

代码语言:javascript
复制
"^(>[^\r\n]*).*?Length\s=\s(\d+)"

设置了这两个选项(使用管道符号)。

第一个捕获组将匹配所有内容,直到> (独立于您的操作系统)之后的第一行中断。然后,.*?将匹配任何字符,直到遇到第一次 Length为止。剩下的和你的第一次尝试是一样的。

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

票数 0
EN

Stack Overflow用户

发布于 2022-05-23 03:47:51

代码语言:javascript
复制
sample_blast = """
>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("^>(.*?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)
match = regex.findall(sample_blast)

print(match)
代码语言:javascript
复制
[("U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete\n\n       cds. #some records don't have this line (see below)\n\n       ", '2575'),
 ('U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete\n\n       ', '2575')]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13110907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档