Как найти подстроки между подстрокой внутри строки питона?

1

Пусть строка будет "AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT". Я хочу найти строки между AAAG и AGCT.

Я хотел бы, чтобы результат был ["QWERTYUIOP","ZXCVBNM"], т. ["QWERTYUIOP","ZXCVBNM"] Список строк.

Как я могу использовать регулярное выражение или подобные методы для этого?

Я попробовал это

def find_distances_between_motifs(positions1, positions2, motif_length1):
diff1 = []
diff2 = []
pos2 = 0
flag = 0
for pos1 in range(len(positions1)):
    if pos2 >= len(positions2):
        break
    if flag == 1:
        flag = 0
        pos1 -= 1
    if positions2[pos2] - positions1[pos1] > 30:
        diff1.append(NaN)
        diff2.append(NaN)
        continue
    elif positions2[pos2] - positions1[pos1] < 1:
        pos2 += 1
        diff2.append(NaN)
        flag = 1
    elif pos1 < len(positions1) - 1 and positions1[pos1+1] > positions2[pos2]:
        diff1.append(positions[pos2] - positions[pos1] - motif_length1)
        diff2.append(pos2)
        pos2 += 1
    else:
        continue
return diff1, diff2

Я хотел вернуть два массива - один с расположением последовательности последовательностей между мотивами, а во-вторых с расположением второго мотива, который даст предыдущие расстояния.

  • 0
    ["QWERTYUIOP","HJKL","ZXCVBNM"] выходные данные не должны быть ["QWERTYUIOP","HJKL","ZXCVBNM"] ?
  • 0
    Нет! Я хочу последовательность между первой и второй подстрокой, а не между второй и первой.
Теги:
string
bioinformatics

2 ответа

7
Лучший ответ

Используйте Regex. re.findall с Lookbehind & Lookahead

Пример:

import re
s = "AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT"
print( re.findall(r"(?<=AAAG).*?(?=AGCT)", s))

Выход:

['QWERTYUIOP', 'ZXCVBNM']
  • 1
    У ОП также было это плохо сформулированное требование: «Я хотел вернуть два массива - один с расположением длины последовательностей между мотивами, а второй - с расположением второго мотива, который даст предыдущие расстояния». Независимо от того, что ему нужно, он, вероятно, мог бы быть хорошо обслужен, если изменить re.findall на re.finditer который возвращает объекты Match . Затем с Match m , m.group(0) дает соответствующую строку, а m.start() и m.end() дают индексы соответствия. С этими показателями можно рассчитать все остальное.
  • 0
    Это требование не было необходимым. Я пытался что-то найти, чтобы найти последовательности. Я могу работать только с последовательностями.
1

Если вы не хотите использовать выражение регулярных выражений, то я сделал код. Он немного сложный, но если вы внимательно посмотрите на него, тогда вы поймете.

def addd(llist,word,word2):
    xx1 = sum([[i, word] for i in llist], [])[:-1]
    try:iii = xx1.index(word2);del xx1[iii]
    except:pass
    return xx1
a,output = addd("AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT".split("AAAG"),"St4rT",""),[]
for i,x in enumerate(a):
    if "AGCT" in x:
        output.append(addd(x.split("AGCT"),"3nD.",""))
    else:output.append(x)
total = []
for i in output:
    if isinstance(i,list):total+=i
    elif isinstance(i,str):total.append(i)
output,typ = [],0
for x,i in enumerate(total):
    if typ == 0 and i == "St4rT":
        try:output.append(total[x+1]);typ = 1
        except:pass
    elif typ == 1 and i == "3nD.":typ = 0
print(output)

Выход:

['QWERTYUIOP', 'ZXCVBNM']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню