バイオインフォマティクスの分野では、膨大な生物学データの解析が必要になります。DNA配列、タンパク質配列、遺伝子発現データなど、さまざまなデータセットを効率よく処理するためには、データのパターンを認識し、特定の形式や内容を抽出する技術が重要です。そこで、Python3を用いた正規表現(Regular Expression、略して「正規表現」)は、データ解析において非常に有用です。この記事では、バイオインフォマティクスの文脈でPythonの正規表現の基本的な使い方から、応用的な技術までを解説します。
正規表現とは?
正規表現は、文字列のパターンを表現するための一種の「言語」です。これを使うことで、特定のパターンに一致する文字列を検索、抽出、置換することが可能になります。例えば、DNA配列の中で特定のモチーフ(例えば、ATGCのような特定の配列)を見つけたり、特定の形式に従ったデータを抽出したりする際に役立ちます。
Pythonで正規表現を使うための基本
Pythonでは、正規表現を扱うために標準ライブラリのre
モジュールを使用します。まずは基本的な使い方を見ていきましょう。
import re
# サンプルDNA配列
dna_seq = "ATGCGTACGATCGAATCGTACGTT"
# 正規表現パターン: 'ATG' というモチーフを検索
pattern = r"ATG"
match = re.search(pattern, dna_seq)
if match:
print(f"マッチしたパターン: {match.group()} 位置: {match.start()}-{match.end()}")
この例では、DNA配列の中から「ATG」というモチーフを探しています。re.search
は、文字列の中で最初に見つかった一致を返します。正規表現パターンは、Pythonのr
(raw string)を使って指定します。re.search
以外にも、re.findall
で全ての一致をリストで取得することもできます。
matches = re.findall(pattern, dna_seq)
print(f"見つかったモチーフ: {matches}")
基本的な正規表現のメタ文字
正規表現には、特殊な意味を持つメタ文字がいくつか存在します。これらを使うことで、複雑なパターンを表現することができます。
.
: 任意の1文字^
: 行の先頭$
: 行の末尾*
: 直前の文字が0回以上繰り返される+
: 直前の文字が1回以上繰り返される[]
: 文字クラス。括弧内のいずれかの文字と一致|
: ORの意味
例えば、DNA配列中の「A」または「T」に続く「G」を見つける場合、次のように書けます。
pattern = r"[AT]G"
matches = re.findall(pattern, dna_seq)
print(f"見つかったパターン: {matches}")
これにより、「ATG」や「TGA」のような配列が抽出されます。
応用編:ゲノム配列の解析
バイオインフォマティクスの実際の応用として、ゲノム配列から特定のモチーフを抽出する例を見てみましょう。ここでは、プロモーター領域に含まれるTATAボックス(TATAAAまたはそれに類似したパターン)を正規表現で探す例を紹介します。
# TATAボックスのパターン(TATA followed by any two nucleotides)
pattern = r"TATA[ATCG]{2}"
dna_seq = "CGTATAGCGTATAAAGTATATACGT"
matches = re.findall(pattern, dna_seq)
print(f"見つかったTATAボックス: {matches}")
このコードでは、TATAの後に任意の2つの塩基(A、T、C、G)が続くパターンを検索しています。[ATCG]{2}
は、任意の2つのヌクレオチドを意味します。このように、正規表現を活用することで、ゲノム配列中の特定の領域やモチーフを柔軟に検出することが可能です。
複雑なパターンの検索
さらに複雑な検索パターンを使って、バイオインフォマティクスデータを扱うことも可能です。たとえば、変異(SNP:一塩基多型)を検出したり、リピート領域を探したりすることができます。
次に、変異の一例として、RFLP(制限酵素断片長多型)の変異を検索する場合の例を示します。RFLPは、特定の制限酵素が認識する配列に変異が生じ、切断されるパターンが変わる現象です。
# 正規表現を使用して制限酵素EcoRIの切断サイト(GAATTC)を探す
pattern = r"GAATTC"
dna_seq = "GCGGAATTCGCGGAATTCCCGGAATT"
matches = re.finditer(pattern, dna_seq)
for match in matches:
print(f"EcoRI認識サイト: 位置 {match.start()}-{match.end()}")
このコードでは、EcoRIが認識する「GAATTC」配列を見つけ出し、その位置を出力します。さらに、re.finditer
を使うことで、配列全体の一致箇所をイテレータとして取得し、ループで処理できます。
応用的な正規表現のテクニック
バイオインフォマティクスでは、データの構造や形式に基づいた複雑なパターンを処理することがよくあります。以下では、応用的なテクニックをいくつか紹介します。
1. キャプチャグループを使った詳細な情報の取得
正規表現では、括弧()
を使って部分的に一致するパターンを「キャプチャ」できます。これを活用することで、マッチした部分の詳細な情報を取得できます。
# キャプチャグループを使って、塩基配列のモチーフを抽出
pattern = r"(ATG)([ATCG]{3})(TAA|TAG|TGA)"
dna_seq = "ATGCGTTAAATGCGTTAGATGCGTGAG"
matches = re.findall(pattern, dna_seq)
print(f"キャプチャされた部分: {matches}")
このコードでは、「開始コドン(ATG)」、「任意の3つのヌクレオチド」、「終止コドン(TAA、TAG、TGA)」というパターンを検索し、各部分をキャプチャしています。
2. 繰り返しパターンの検出
ゲノムにはリピート領域と呼ばれる、同じ配列が何度も繰り返される領域が存在します。これを正規表現で検出することも可能です。
# 繰り返し配列を探す例
pattern = r"(ATG){2,}"
dna_seq = "ATGATGCGTATGATGATGCGT"
matches = re.findall(pattern, dna_seq)
print(f"見つかった繰り返し: {matches}")
ここでは、ATGが2回以上連続して現れる箇所を検索しています。
まとめ
Python3を使った正規表現は、バイオインフォマティクスのデータ解析において非常に強力なツールです。正規表現を使えば、ゲノム配列やタンパク質配列から特定のパターンを素早く検索・抽出でき、効率的に解析を進めることができます。基本的なメタ文字やキャプチャグループを理解し、応用的な使い方に慣れてくることで、より複雑なデータ解析にも対応できるようになるでしょう。