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



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

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

GGATGTGGGGGGATGT
GGATGTGGGGGGATGTCCCCCATGT

带有以下代码:

import re
seq = 'ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG'
matches = re.findall("[ACGT]{4,}ATGT", seq)
if matches:
for match in matches:
print(match)

我只有

GGATGTGGGGGGATGTCCCCCATGT

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

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

然后我得到了:

GGATGTGGGGGGATGTCCCCCATGT
GATGTGGGGGGATGTCCCCCATGT
ATGTGGGGGGATGTCCCCCATGT
TGTGGGGGGATGTCCCCCATGT
GTGGGGGGATGTCCCCCATGT
TGGGGGGATGTCCCCCATGT
GGGGGGATGTCCCCCATGT
GGGGGATGTCCCCCATGT
GGGGATGTCCCCCATGT
GGGATGTCCCCCATGT
GGATGTCCCCCATGT
GATGTCCCCCATGT
ATGTCCCCCATGT
TGTCCCCCATGT
GTCCCCCATGT
TCCCCCATGT
CCCCCATGT
CCCCATGT

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

您可以使用PyPi的regex模块,只需在初始模式上添加一小部分即可使用反向和重叠匹配:

(?r)[ACGT]{4,}ATGT

例如:

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

打印:

['GGATGTGGGGGGATGTCCCCCATGT', 'GGATGTGGGGGGATGT']

最新更新