查找每个正则表达式至少重复一次的正则表达式

2024-04-19 17:50:36 发布

您现在位置:Python中文网/ 问答频道 /正文

从任何*.fasta DNA序列(只有'ACTG'字符)中,我必须找到每个字母至少有一个重复的所有序列。你知道吗

例如“AAGTCCTAG”序列,我应该能够找到:“AAGTC”、“AGTC”、“GTCCTA”、“TCCTAG”、“CCTAG”和“CTAG”(每个字母的迭代)。你知道吗

我不知道如何在pyhton 2.7中做到这一点。我尝试使用正则表达式,但它并不是搜索所有的变体。你知道吗

我怎样才能做到?你知道吗


Tags: pyhton字母序列变体字符fastadnactag
3条回答

由于您要查找的子字符串可能有任意长度,所以后进先出队列似乎可以工作。一次追加每个字母,检查每个字母中是否至少有一个字母。如果找到了,把它还给我。然后去掉前面的字母,继续检查直到不再有效。你知道吗

def find_agtc_seq(seq_in):
    chars = 'AGTC'
    cur_str = []
    for ch in seq_in:
        cur_str.append(ch)
        while all(map(cur_str.count,chars)):
            yield("".join(cur_str))
            cur_str.pop(0)

seq = 'AAGTCCTAG'
for substr in find_agtc_seq(seq):
    print(substr)

这似乎导致了您要查找的子字符串:

AAGTC
AGTC
GTCCTA
TCCTAG
CCTAG
CTAG

这是另一种方法。也许没有克里斯·安斯那么快那么好。但对于初学者来说,阅读和理解可能要简单一些。你知道吗

DNA='AAGTCCTAG'
toSave=[]
for i in range(len(DNA)):
    letters=['A','G','T','C']
    j=i
    seq=[]
    while len(letters)>0 and j<(len(DNA)):
        seq.append(DNA[j])
        try:
            letters.remove(DNA[j])
        except:
            pass
        j+=1
    if len(letters)==0:
        toSave.append(seq)

print(toSave)

您可以找到长度为4+的所有子字符串,然后从中向下选择,只找到包含每个字母中一个的最短可能组合:

s = 'AAGTCCTAG'

def get_shortest(s):
  l, b = len(s), set('ATCG')
  options = [s[i:j+1] for i in range(l) for j in range(i,l) if (j+1)-i > 3]
  return [i for i in options if len(set(i) & b) == 4 and (set(i) != set(i[:-1]))]

print(get_shortest(s))

输出:

['AAGTC', 'AGTC', 'GTCCTA', 'TCCTAG', 'CCTAG', 'CTAG']

相关问题 更多 >