Пусть строка будет "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
Я хотел вернуть два массива - один с расположением последовательности последовательностей между мотивами, а во-вторых с расположением второго мотива, который даст предыдущие расстояния.
Используйте Regex. re.findall
с Lookbehind & Lookahead
Пример:
import re
s = "AAAGQWERTYUIOPAGCTHJKLAAAGZXCVBNMAGCT"
print( re.findall(r"(?<=AAAG).*?(?=AGCT)", s))
Выход:
['QWERTYUIOP', 'ZXCVBNM']
re.findall
на re.finditer
который возвращает объекты Match
. Затем с Match m
, m.group(0)
дает соответствующую строку, а m.start()
и m.end()
дают индексы соответствия. С этими показателями можно рассчитать все остальное.
Если вы не хотите использовать выражение регулярных выражений, то я сделал код. Он немного сложный, но если вы внимательно посмотрите на него, тогда вы поймете.
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']
["QWERTYUIOP","HJKL","ZXCVBNM"]
выходные данные не должны быть["QWERTYUIOP","HJKL","ZXCVBNM"]
?