バイオインフォマティクスの分野でPython3を活用する際、データの解析や整形は非常に重要な作業の一部です。特に、DNAやタンパク質の配列データの解析において、文字列の操作やパターンの検索は頻繁に行われます。Pythonには、文字列操作を強力にサポートするライブラリとして「正規表現(Regular Expressions: regex)」が組み込まれており、これを利用することで複雑なパターンマッチングが可能になります。
この記事では、「正規表現オプションとマッチング時の挙動」に焦点を当て、その基本と応用について解説します。
正規表現の基本:Pythonでの使用方法
まず、正規表現を使うためにはPythonの標準ライブラリであるre
モジュールをインポートする必要があります。
import re
re
モジュールでは、search
、match
、findall
、sub
など、さまざまな関数を使用して正規表現パターンに基づいた文字列操作が可能です。例えば、特定のDNA塩基配列を検索したい場合、以下のように記述できます。
sequence = "AGCTGATCGTAGCTAGT"
pattern = "GCT"
match = re.search(pattern, sequence)
if match:
print(f"Pattern found: {match.group()} at position {match.start()}-{match.end()}")
このコードでは、塩基配列AGCTGATCGTAGCTAGT
の中から、パターンGCT
を検索し、見つかった場合はその位置を表示します。
正規表現オプションの重要性
正規表現オプションは、パターンマッチングの際の挙動を細かく制御するために使用されます。たとえば、大文字・小文字を区別しない検索や、複数行にわたるテキストの検索などが挙げられます。これらのオプションは、re
モジュールの関数にフラグとして渡すことができます。
主なオプション
re.IGNORECASE
(re.I
)
大文字・小文字を区別しない検索を行います。たとえば、DNAやタンパク質の配列データでは、大文字・小文字の違いが実質的に意味を持たないことが多いため、このオプションはよく使用されます。
pattern = "gct"
match = re.search(pattern, sequence, re.IGNORECASE)
この例では、GCT
とgct
の区別なくパターンを検索します。
re.MULTILINE
(re.M
)
複数行にまたがる文字列の検索を行います。通常、^
は文字列の先頭、$
は文字列の末尾を表しますが、このオプションを指定すると、行の先頭や末尾として解釈されるようになります。
text = """AGCTGATCGTAGCTAGT
AGTAGCTAGCTGACT"""
pattern = "^AGT"
matches = re.findall(pattern, text, re.MULTILINE)
このコードは、各行の先頭がAGT
で始まるかどうかを検索します。
re.DOTALL
(re.S
).
(ドット)は通常、任意の1文字にマッチしますが、改行文字\n
にはマッチしません。しかし、re.DOTALL
オプションを指定すると、改行文字を含むすべての文字にマッチします。
text = "AGCTGATCGTAGC\nTAGCTAGT"
pattern = "A.*T"
match = re.search(pattern, text, re.DOTALL)
この場合、A
からT
までの間に改行が含まれていてもマッチします。
re.VERBOSE
(re.X
)
正規表現パターンの可読性を高めるために、パターン内にコメントや空白を挿入できるオプションです。特に複雑な正規表現パターンを扱う場合に役立ちます。
pattern = re.compile(r"""
A # Aの文字
. # 任意の1文字
T # Tの文字
""", re.VERBOSE)
このように、パターンの意味をコメントで説明しつつ、より読みやすく書くことができます。
応用例:バイオインフォマティクスにおける正規表現の活用
バイオインフォマティクスでは、正規表現を利用してDNA配列やタンパク質配列の解析を行う場面が多くあります。ここでは、いくつかの応用例を紹介します。
1. 配列のモチーフ検索
特定のモチーフ(特徴的な配列パターン)を配列データの中から探すことは、タンパク質機能の予測や進化的な比較において重要です。たとえば、Nグリコシル化サイトを示すモチーフN{P}[ST]{P}
を検索するには以下のように書けます。
sequence = "ASNGTSPASNQTSPGNG"
pattern = r"N[^P][ST][^P]"
matches = re.findall(pattern, sequence)
print(matches) # ['NGTS', 'NQTS']
このコードは、N
の次にP
以外の文字、続いてS
またはT
、さらにP
以外の文字が続くパターンを検索しています。
2. 塩基対のカウントと配列の特徴分析
塩基配列の中で特定の塩基対(例えばGC
やAT
の出現頻度)をカウントすることは、ゲノム解析において非常に重要です。正規表現を使えば、簡単にこのようなカウントができます。
sequence = "AGCTGATCGTAGCTAGT"
gc_count = len(re.findall(r"[GC]", sequence))
at_count = len(re.findall(r"[AT]", sequence))
print(f"GC content: {gc_count}")
print(f"AT content: {at_count}")
このコードは、塩基配列中のG
とC
の数、A
とT
の数をそれぞれカウントします。
3. FASTAファイルの解析
FASTA形式のファイルは、バイオインフォマティクスにおいてよく使用されるフォーマットです。FASTAファイルの解析に正規表現を活用すると、ヘッダー部分と配列部分を簡単に抽出できます。
fasta = """>sequence1
AGCTGATCGTAGCTAGT
>sequence2
TGCTAGCTGATCGTAGC"""
sequences = re.findall(r">(.*?)\n([A-Z\n]+)", fasta)
for header, sequence in sequences:
sequence_clean = sequence.replace('\n', '')
print(f"Header: {header}")
print(f"Sequence: {sequence_clean}")
この例では、FASTA形式のヘッダーと配列部分をそれぞれ抽出し、配列部分の改行を除去して出力しています。
まとめ
正規表現は、バイオインフォマティクスにおいて非常に強力なツールです。Python3のre
モジュールを活用することで、複雑なパターンの検索や文字列操作を効率的に行うことができます。この記事では、正規表現の基本的な使用法から、オプションによる挙動制御、さらにバイオインフォマティクスでの応用例までを紹介しました。
今後、さらに高度な正規表現の使い方をマスターすることで、DNAやタンパク質の解析をより迅速かつ正確に行えるようになるでしょう。