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从左到右搜索并允许重叠呢?
您可以使用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)