Python3〜正規表現の使い方(基本と応用)

スポンサーリンク

バイオインフォマティクスの分野では、膨大な生物学データの解析が必要になります。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を使った正規表現は、バイオインフォマティクスのデータ解析において非常に強力なツールです。正規表現を使えば、ゲノム配列やタンパク質配列から特定のパターンを素早く検索・抽出でき、効率的に解析を進めることができます。基本的なメタ文字やキャプチャグループを理解し、応用的な使い方に慣れてくることで、より複雑なデータ解析にも対応できるようになるでしょう。

タイトルとURLをコピーしました