python中特定模式内的剪切字符串

python中特定模式内的剪切字符串,python,string,bioinformatics,Python,String,Bioinformatics,我有一些长度的字符串,仅由4个字符组成,即“A、T、G和C”。我在给定的字符串中多次出现“GAATTC”模式。我必须在这个图案的地方每隔一段时间剪断一段绳子。。 例如,对于字符串“ATCGAATTCATA”,我应该得到 字符串一-ATCGA 字符串二-ATTCATA 我是使用Python的新手,但我提出了以下(不完整)代码: 非常感谢您的帮助。这里有一个简单的解决方案: seq = 'ATCGAATTCATA' seq_split = seq.upper().split('GAATTC')

我有一些长度的字符串,仅由4个字符组成,即“A、T、G和C”。我在给定的字符串中多次出现“GAATTC”模式。我必须在这个图案的地方每隔一段时间剪断一段绳子。。 例如,对于字符串“ATCGAATTCATA”,我应该得到

  • 字符串一-
    ATCGA
  • 字符串二-
    ATTCATA
我是使用Python的新手,但我提出了以下(不完整)代码:


非常感谢您的帮助。

这里有一个简单的解决方案:

seq = 'ATCGAATTCATA'
seq_split = seq.upper().split('GAATTC')
result = [ 
    (seq_split[i]  + 'GA') if i % 2 == 0 else ('ATTC' + seq_split[i]) 
    for i in range(len(seq_split)) if len(seq_split[i]) > 0 
]
结果:

print(result)
['ATCGA', 'ATTCATA']

我的代码有点草率,但当您想迭代多次出现的字符串时,可以尝试类似的方法

def split_strings(seq):
    string1 = seq[:seq.find(str1) +2]
    string2 = seq[seq.find(str1) +2:]
    return string1, string2


test = 'ATCGAATTCATA'.upper()
str1 = 'GAATTC'

seq = test
while str1 in seq:
    string1, seq = split_strings(seq)
    print string1
print seq

BioPython有一个限制性内切酶包,完全按照你的要求来做

from Bio.Restriction import *
from Bio.Alphabet.IUPAC import IUPACAmbiguousDNA

print(EcoRI.site) # You will see that this is the enzyme you listed above

test = 'ATCGAATTCATA'.upper() # This is the sequence you want to search
my_seq = Seq(test, IUPACAmbiguousDNA()) # Create a biopython Seq object with our sequence

cut_sites = EcoRI.search(my_seq)
cut_站点
包含精确剪切输入序列的位置列表(例如
GA
位于左序列,而
ATTC
位于右序列)

然后,您可以使用以下方法将序列拆分为重叠:

cut_sites = [0] + cut_sites # We add a leading zero so this works for the first
                            # contig. This might not always be needed.
contigs = [test[i:j] for i,j in zip(cut_sites, cut_sites[1:]+[None])]

您可以查看有关BioPython的更多详细信息。

这里有一个使用正则表达式模块的解决方案:

import re
seq = 'ATCGAATTCATA'
restriction_site = re.compile('GAATTC')
subseq_start = 0
for match in restriction_site.finditer(seq):
   print seq[subseq_start:match.start()+2]
   subseq_start = match.start()+2
print seq[subseq_start:]
输出:

ATCGA
ATTCATA

首先,让我们发展一下使用find的想法,这样您就可以找出错误

seq = 'ATCGAATTCATAATCGAATTCATAATCGAATTCATA'
seq = seq.upper()
pattern = "GAATTC"
split_at = 2
seqlen = len(seq)
i = 0

while i < seqlen:
    site = seq.find(pattern, i)
    if site != -1:
       print(seq[i: site + split_at])
       i = site + split_at
    else:
       print seq[i:]
       break

我认为它更直观,应该比RE更快(根据库和使用情况,RE的性能可能更低)

您的问题是什么?为什么预期输出包含拆分器字符串的部分,我们应该如何将其拆分为字符串1和字符串2?@TigerhawkT3如何剪切字符串?我想找到模式“GAATTC”,并在该模式中,我想在“GA”处拆分字符串,以便生成的字符串将为我提供fast一半到GA,另一半从ATTC开始。这与上面提到的示例有关。对于造成的任何混乱,我深表歉意。不要重新发明轮子;BioPython有一些专门处理限制性酶位点的功能@Chris_Rands感谢您的建议。我完全了解BioPython。不过,我的目标是执行此exercise不使用BioPython模块。尽管如此,再次感谢!如果给定字符串中多次出现“GAATTC”,这将不起作用@Thank!您的建议确实有效。但是,它仅限于模式的一次出现。如果模式“GAATTC”出现多次,则不考虑下一次出现。针对多次出现更新恩斯。第二个解决方案与第一个解决方案相比非常令人惊讶。尽管如此,即使第一个解决方案也很有效,而且也很好。非常感谢您!@Srk谢谢,我也很喜欢,但对于我没有立即意识到第二个解决方案,我还是有点惊讶。另外一个好处是,替换可以与任何文本编辑器一起工作。顺便说一句,如果您觉得解决方案有用,请不要犹豫投票或接受。我在访问模块时遇到了一段相当困难的时间,无论如何,感谢您提供的解决方案,它对我非常有效!
seq = 'ATCGAATTCATAATCGAATTCATAATCGAATTCATA'
seq = seq.upper()
pattern = "GAATTC"
split_at = 2
seqlen = len(seq)
i = 0

while i < seqlen:
    site = seq.find(pattern, i)
    if site != -1:
       print(seq[i: site + split_at])
       i = site + split_at
    else:
       print seq[i:]
       break
seq = 'ATCGAATTCATAATCGAATTCATAATCGAATTCATA'
seq = seq.upper()
pattern = "GA","ATTC"
pattern1 = ''.join(pattern) # 'GAATTC'
pattern2 = ' '.join(pattern) # 'GA ATTC'
splited_seq = seq.replace(pattern1, pattern2) # 'ATCGA ATTCATAATCGA ATTCATAATCGA ATTCATA'
print (splited_seq.split())