モチーフの抽出ができたらそれが一体どこにあるのか列記したい。
import re
text = """GACTTTAGATGGCTTCTTCCTTTATAACCAATTGATATTGCATACTCTGATGAGATTTAT
AATTAAAGAAGCAGAAACAAAAACAAGTAAAACAGAAACAATCAACACAGAGAAACCACC
CCGAGAATATCTCCATTGGTTGGTGACTGATATCCCTGCTACAACTGGAACAACCTTTGG"""
list1 = text.split()
motif = """AAACA AAACAA AACAA AGAAA AGAAAC GAAAC"""
list2= motif.split()
for i, w in enumelate(list1):
for k in list2:
m = re.finditer(k,w)
for match in m:
print(i, match)
実行すると
$ python3 motif1.py
1 <_sre.SRE_Match object; span=(14, 19), match='AAACA'>
1 <_sre.SRE_Match object; span=(20, 25), match='AAACA'>
1 <_sre.SRE_Match object; span=(29, 34), match='AAACA'>
1 <_sre.SRE_Match object; span=(35, 40), match='AAACA'>
1 <_sre.SRE_Match object; span=(14, 20), match='AAACAA'>
1 <_sre.SRE_Match object; span=(20, 26), match='AAACAA'>
1 <_sre.SRE_Match object; span=(35, 41), match='AAACAA'>
1 <_sre.SRE_Match object; span=(15, 20), match='AACAA'>
1 <_sre.SRE_Match object; span=(21, 26), match='AACAA'>
1 <_sre.SRE_Match object; span=(36, 41), match='AACAA'>
1 <_sre.SRE_Match object; span=(12, 17), match='AGAAA'>
1 <_sre.SRE_Match object; span=(33, 38), match='AGAAA'>
1 <_sre.SRE_Match object; span=(50, 55), match='AGAAA'>
1 <_sre.SRE_Match object; span=(12, 18), match='AGAAAC'>
1 <_sre.SRE_Match object; span=(33, 39), match='AGAAAC'>
1 <_sre.SRE_Match object; span=(50, 56), match='AGAAAC'>
1 <_sre.SRE_Match object; span=(13, 18), match='GAAAC'>
1 <_sre.SRE_Match object; span=(34, 39), match='GAAAC'>
1 <_sre.SRE_Match object; span=(51, 56), match='GAAAC'>
2 <_sre.SRE_Match object; span=(48, 53), match='AACAA'>
こんな感じ。
span=()のところに存在位置が表示されている
このあとの処理がやりやすいようにもうちょっと整形しておきたいが。
import re
text = """GACTTTAGATGGCTTCTTCCTTTATAACCAATTGATATTGCATACTCTGATGAGATTTAT
AATTAAAGAAGCAGAAACAAAAACAAGTAAAACAGAAACAATCAACACAGAGAAACCACC
CCGAGAATATCTCCATTGGTTGGTGACTGATATCCCTGCTACAACTGGAACAACCTTTGG"""
list1 = text.split()
motif = """AAACA AAACAA AACAA AGAAA AGAAAC GAAAC"""
list2= motif.split()
for i, w in enumerate(list1):
for k in list2:
m = re.finditer(k,w)
for match in m:
print(i, match.group(), match.start())
これだ。
$ python3 motif2.py
1 AAACA 14
1 AAACA 20
1 AAACA 29
1 AAACA 35
1 AAACAA 14
1 AAACAA 20
1 AAACAA 35
1 AACAA 15
1 AACAA 21
1 AACAA 36
1 AGAAA 12
1 AGAAA 33
1 AGAAA 50
1 AGAAAC 12
1 AGAAAC 33
1 AGAAAC 50
1 GAAAC 13
1 GAAAC 34
1 GAAAC 51
2 AACAA 48
なお、match.span()とすると(start, end)のタプルが返る。end()だとendだけ。
検索したい配列とモチーフをそれぞれファイルで用意しておいて(各1行に1配列)スクリプトに食わせる
import sys
import argparse
import re
def get_args():
parser = argparse.ArgumentParser()
if sys.stdin.isatty():
parser.add_argument("file", help="please set seq file", type=str)
parser.add_argument("motif", help="please set motif list", type=str)
args = parser.parse_args()
return(args)
def main():
args = get_args()
if hasattr(args, 'file'):
file = args.file
if hasattr(args, 'motif'):
motif = args.motif
with open(file) as list1:
for i, w in enumerate(list1):
with open(motif) as list2:
for k in list2:
m = re.finditer(k.strip(),w)
for match in m:
print(i, match.group(), match.start())
if __name__ == '__main__':
main()
第一引数に配列ファイル、第二引数にモチーフファイルをつけて実行。出力はそのままだと標準出力。
2/11追記
reのfinditerでは重複したモチーフは飛ばされてしまうことが判明したので修正
import sys
import argparse
import regex
def get_args():
parser = argparse.ArgumentParser()
if sys.stdin.isatty():
parser.add_argument("file", help="please set seq file", type=str)
parser.add_argument("motif", help="please set motif list", type=str)
args = parser.parse_args()
return(args)
def main():
args = get_args()
if hasattr(args, 'file'):
file = args.file
if hasattr(args, 'motif'):
motif = args.motif
with open(file) as list1:
for i, w in enumerate(list1):
with open(motif) as list2:
for k in list2:
m = regex.finditer(k.strip(),w,overlapped=True)
for match in m:
print(i, match.group(), match.start(), match.end())
if __name__ == '__main__':
main()
これでOKのはず。