在Python 3中查找字符串模式并在多次出现时打印以下字符

时间:2014-07-21 11:58:25

标签: python loops printing

我在10年后重新开始编程,现在我正在尝试学习Python。我正在做生物化学学位,并希望用编程来分析DNA序列。我需要在序列中找到所有“ga”,“gc”,“gg”和“gt”模式,并复制下游的3个碱基和两个靶碱基上游的3个碱基(ga,gc等)。到目前为止,实现它非常简单。但是我需要继续按顺序搜索,因为我的小脚本只是给我第一次出现:

seq = 'cacacgtccgccggccctcagagcccgagcgacttccgccccaggccaccgtccacccgcagaaacgcgccgacccacact'

if 'ga' in seq:
    locSplicing = seq[seq.find('ga')-3:seq.find('ga')+5]
    print(locSplicing)

if 'gg' in seq:
    locSplicing = seq[seq.find('gg')-3:seq.find('gg')+5]
    print(locSplicing)

if 'gt' in seq:
    locSplicing = seq[seq.find('gt')-3:seq.find('gt')+5]
    print(locSplicing)

if 'gc' in seq:
    locSplicing = seq[seq.find('gc')-3:seq.find('gc')+5]
    print(locSplicing)

输出:

tcagagcc
gccggccc
cacgtccg
tccgccgg

这段代码不够复杂,我知道,但我还是初学者。我不确定是否应继续使用此脚本或使用其他方法作为findall或匹配,然后使用循环(for或while)打印出所有出现(不仅是第一个)。有人可以给我一个方向吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

当你在字符串的开头/结尾时,我必须稍微调整一下来处理它,但是这里有一些东西可以找到每个匹配的三个前辈和后继者。

>>> import re
>>> seq = 'cacacgtccgccggccctcagagcccgagcgacttccgccccaggccaccgtccacccgcagaaacgcgccgacccacact'

索引

>>> [i.start() for i in re.finditer('ga', seq)]
[20, 26, 30, 61, 71]

匹配+/- 3个元素

>>> [seq[index-3:index+5] for index in [i.start() for i in re.finditer('ga', seq)]]
['tcagagcc', 'cccgagcg', 'agcgactt', 'gcagaaac', 'gccgaccc']

现在这只是针对子字符串' ga'的匹配。您可以再展开一次以获得其他子串的匹配。

>>> [[seq[index-3:index+5] for index in [i.start() for i in re.finditer(s, seq)]] for s in l]
[['tcagagcc', 'cccgagcg', 'agcgactt', 'gcagaaac', 'gccgaccc'],
 ['gccggccc', 'ccaggcca'],
 ['cacgtccg', 'accgtcca'],
 ['gccggccc', 'ccaggcca']]