質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1117閲覧

if文での部分一致の応用

tkgene

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/09/15 07:05

ゲノム解析にpython3を使用している初心者です。
以下のスクリプトはjupyter notebokを使用しました。

文字列を検索してヒットしたら開始位置を取ってくる以下のようなスクリプトを作成しました。
input fileはfastaファイルといわれる2行からなるデータです。
ex)

line1

ATCGTTTT

line2

ATCGATCG
子のインプットファイルで回すと探したい文字列開始位置を取ってくれます。
例えばTTTを入れると。
4
5
と出力されます。

ここで、”何でもいいから1文字”という条件を含めて検索したいので以下のスクリプトを改良したいです。
例えばTNTという配列を検索し,NはA,T,C,Gのどれでも1文字が入っていればいいです。
塩基配列なので出現する文字はA,T,C,Gの4つのみです。
しかし、スクリプト中にNを定義(N == T or A or C or G) したり re.search()を
使ってみてもエラーだったり、うまく検索されなかったりして困っています。
if文でこのような検索をする場合どうしたらよいかどなたかご教授お願いいたします。

以下が作成した改良前のスクリプトです。

with open('input.txt') as file: for l in file: if '>' in l: continue x = len(l) end = x - 1 last = len('search text') start = 0 while last <= end: if l[start:last] == "search text": print(start) last += 1 start += 1 else: last += 1 start += 1 #4 #5

試したこと↓
Nを定義してみる。

N = A or T or C or G with open('input.txt') as file: for l in file: if '>' in l: continue x = len(l) end = x -1 last = len("T" + N + "T") start = 0 while last <= end: if l[start:last] == "T" + N + "T": print(start) last += 1 start += 1 else: last += 1 start += 1 #エラーも結果も出てきませんでした。

re.searchを使ってみる。

N == A or T or C or G with open('fasta.txt') as file: for l in file: if '>' in l: continue x = len(l) end = x - 1 last = len("T" + N + "T") start = 0 while last <= end: if re.search("T" + N + "T",l[start:last]): print(start) last += 1 start += 1 else: last += 1 start += 1 #エラーも結果も出てきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

FASTAフォーマットのN(aNy)は、正規表現では.(任意の1文字にマッチ)ですかね。TNTと指定されたらT.Tに変換して正規表現で検索すればいいかと。

ついつい、findallfinditerで一気に検索したくなりますが、そうすると**「マッチした部分」の直後の位置から次の検索が行なわれる**ため、TTTTに対してTTTが一度しかマッチしません(先頭のTTTにマッチしたら、次の検索は4文字目のTから行なわれるため)。地道に、「先頭から1文字ずつずらした文字列」に対してひとつひとつマッチを試みる必要があります。

また、FASTAフォーマットは、ひとつのデータが2行に固定されているわけではなく、ヘッダー行の後に複数のシーケンス文字列の行があってもいいので、それに対応するようにしました。ファイルを読みつつ、ヘッダー行の内容をキー、シーケンス文字列を結合した文字列を値とする辞書を作成し、検索は辞書に対して行なうようにしてあります。

Python

1import re 2 3target = "TNT" 4target = target.replace("N", ".") 5 6dic = {} 7seq = None 8key = None 9with open('input.txt', 'r') as file: 10 for line in file: 11 if line.startswith('>'): 12 if key: 13 dic[key] = seq 14 seq = "" 15 key = line[1:].strip() 16 continue 17 seq += line.strip() 18 else: 19 if key: 20 dic[key] = seq 21print(dic) 22 23for key in dic.keys(): 24 print(f"{key}: ", end="") 25 value = dic[key] 26 pos = 0 27 while True: 28 m = re.search(target, value[pos:]) 29 if m is None: 30 break 31 print(pos + m.start(), end=" ") 32 pos += m.start() + 1 33 print()

result

1{'line1': 'ATCGTTTT', 'line2': 'ATCGATCG'} 2line1: 4 5 3line2:

投稿2020/09/15 08:36

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkgene

2020/09/15 11:38

回答ありがとうございます。 このような場合、文字を置き換えるという事を学びました。 大変参考になりました。ありがとうございました。
guest

0

下記でいかがでしょうか。
reモジュールを使うパターンで書いてみました。

python3

1import re 2with open('input.txt') as file: 3 for l in file: 4 if '>' in l: 5 continue 6 search_txt = r"T[ATGC]T" 7 if re.search(p, l): 8 print(re.search(search_txt, l).start()) 9 else: 10 print("Not Found")

投稿2020/09/15 07:22

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkgene

2020/09/15 08:35

回答ありがとうございます。 いただいたスクリプトからヒントをいただき、もう少し複雑な文字列を検索してみました。 今回探しているのは”TGT(何か4文字)ACA"という全10文字の配列です。 しかし、このスクリプトはうまく回りませんでした。 re.searchの挙動はヒットした最初の1つのみ出力なのですか? 以下試したスクリプトです。 """ import re #from sys import argv search_text = r"TGT[ATGC][ATGC][ATGC][ATGC]ACA" #seq = sys rgv[1] #motif = sys.argv[2] with open('input.txt') as file: for l in file: if '>' in l: continue x = len(l) end = x - 1 last = len(search_text) start = 0 while last <= end: if re.search(search_text, l[start:last]): print(re.search(search_text, l).start()) last += 1 start += 1 else: last += 1 start += 1 """
tkgene

2020/09/15 08:37

のちにlinux上で回すためファイルを受け取れるようにargvが入ってますが、気にしないでください。汚くて申し訳ありません。
jeanbiego

2020/09/15 10:05

や、すみません質問を誤読していました。探すのは1回じゃなくてあるだけ全部だったんですね。 そしてもうDaregadaさんが丁寧な回答つけてくれていました。
tkgene

2020/09/15 11:40

いえいえ、こちらも説明足らずでした。 re.searchモジュールの使い方の参考になりました。 早急なご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問