允许 Python re.findall 从左到右查找重叠的数学

Xia*_*ang 3 python regex findall

我的要求很简单,但我就是不知道如何达到它。

这是原始字符串ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG,我想找出所有仅由 组成[ACGT]、以 结尾ATGT且长度至少为 8 的子字符串。我期望的是:

GGATGTGGGGGGATGT
GGATGTGGGGGGATGTCCCCCATGT
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

import re

seq = 'ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG'

matches = re.findall("[ACGT]{4,}ATGT", seq)

if matches:
    for match in matches:
        print(match)
Run Code Online (Sandbox Code Playgroud)

我只得到了

GGATGTGGGGGGATGTCCCCCATGT
Run Code Online (Sandbox Code Playgroud)

较短的那一个不见了。然后我意识到re.findall不允许重叠。我从如何使用正则表达式查找所有重叠匹配中找到了这个解决方案,然后我将代码修改为:

matches = re.findall("(?=([ACGT]{4,}ATGT))", seq)
Run Code Online (Sandbox Code Playgroud)

然后我得到:

GGATGTGGGGGGATGTCCCCCATGT
GATGTGGGGGGATGTCCCCCATGT
ATGTGGGGGGATGTCCCCCATGT
TGTGGGGGGATGTCCCCCATGT
GTGGGGGGATGTCCCCCATGT
TGGGGGGATGTCCCCCATGT
GGGGGGATGTCCCCCATGT
GGGGGATGTCCCCCATGT
GGGGATGTCCCCCATGT
GGGATGTCCCCCATGT
GGATGTCCCCCATGT
GATGTCCCCCATGT
ATGTCCCCCATGT
TGTCCCCCATGT
GTCCCCCATGT
TCCCCCATGT
CCCCCATGT
CCCCATGT
Run Code Online (Sandbox Code Playgroud)

然后我意识到这个搜索是从右到左开始的。那么我怎样才能要求re.findall从左到右搜索并允许重叠呢?

Jvd*_*vdV 5

您可以使用PyPi的正则表达式模块,利用反向和重叠匹配,仅对初始模式进行少量添加:

(?r)[ACGT]{4,}ATGT
Run Code Online (Sandbox Code Playgroud)

例如:

import regex as re
seq = 'ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG'
matches = re.findall(r'(?r)[ACGT]{4,}ATGT', seq, overlapped=True)
print(matches)
Run Code Online (Sandbox Code Playgroud)

印刷:

['GGATGTGGGGGGATGTCCCCCATGT', 'GGATGTGGGGGGATGT']
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,并且解释得很好,您能详细解释一下这个重叠的标志吗?谢谢。 (2认同)