我的要求很简单,但我就是不知道如何达到它。
这是原始字符串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']