یافتن توالی های ژنتیکی با عبارت های منظم در پایتون — راهنمای کاربردی

۳۴۶ بازدید
آخرین به‌روزرسانی: ۳۰ بهمن ۱۴۰۲
زمان مطالعه: ۷ دقیقه
یافتن توالی های ژنتیکی با عبارت های منظم در پایتون — راهنمای کاربردی

عبارت های منظم در پایتون می‌توانند برای کمک به یافتن الگوهای مختلف ژنتیکی مورد استفاده قرار گیرند. ما می‌توانیم از این عبارت ها (regex) در زمان آنالیز داده‌های توالی ژنتیکی استفاده کنیم، چون به طور مکرر به دنبال الگوهایی در DNA ،RNA و پروتئین‌ها می‌گردیم. این انواع داده‌های توالی صرفاً رشته‌هایی هستند که می‌توان با استفاده از regex آن‌ها را مورد آنالیز الگو قرار داد. برای مثال اگر علاقه‌مند باشیم به دنبال تکرارهای نوکلئوتیدهای مسئول بیماری انسان، سایت‌های اتصال عامل رونویسی DNA، آنزیم محدودسازی سایت‌های برش و جهش‌های خاص بگردیم، همگی این موارد با استفاده از regex میسر هستند.

برای این که بتوانیم از regex به این منظور استفاده کنیم باید ابتدا درک درستی از ساختار ابتدایی regex و برخی کارکردهای خاص ماژول regex پایتون داشته باشیم. در بخش نخست این راهنما، نمونه‌هایی معرفی شده‌اند که از 4 نوکلئوتید DNA یعنی A ،T ،G و C استفاده می‌کنند.

هدف این راهنمای کوتاه موارد زیر است:

  1. معرفی ساختار regex با مثال‌های خاص برای ژنتیک
  2. نمایش شیوه استفاده از تابع‌های مرسوم regex برای یافتن الگوها

عبارت‌های منظم

کاراکترهای زیر در regex نقش خاص دارند و در جدول 1 توضیح هر کدام ارائه شده است:

$^.*+?{ } [] | \

متا کاراکترهای ^ و $ به نام لنگر (anchor) شناخته می‌شوند و موقعیت‌هایی را در رشته ورودی نمایش می‌دهند. کاراکتر ^ با آغاز رشته مطابقت دارد و $ نیز با انتهای یک رشته تطبیق می‌یابد. الگوی CCC^ با عبارت CCCGGG مطابقت دارد اما با GGGCCC تطبیق نمی‌یابد. الگوی AAA$ با عبارت TTTAAA مطابقت دارد، اما با AAAGGG مطابقت ندارد.

کاراکتر نقطه (نقطه اعشار) یک کاراکتر وایلدکارد است که هر کاراکتر دیگر را پیدا می‌کند. اگر یک کیناز پروتئین، توالی توافقی RXYVHXFDEXK را داشته باشد که X نشان‌دهنده هر اسیدآمینه است در این صورت regex به شکل R.YVH.FDE.K در جستجو به دنبال «زیرلایه» (substrates) موفق خواهد بود. با این حال، باید هشدار داد که نقطه با هر کاراکتری، حتی اگر حرف هم نباشد، تطبیق می‌یابد. از این رو الگوی R.YVH.FDE.K می‌تواند با R8YVH£FDE&K نیز تطبیق پیدا کنید که احتمالاً مد نظر ما نیست.

متا کاراکترهای *, +,?, and { } عملگرهای کمّی‌ساز هستند. این موارد برای تعیین تکرارهای کاراکتر یا گروه کاراکترها استفاده می‌شوند. کاراکتر ستاره به همراه یک کاراکتر دیگر یا گروهی از کاراکترها به این معنی است که آن کاراکتر یا گروه اختیاری هستند، اما می‌توانند تکرار نیز بشوند. مثالی از این حالت در رشته ژنتیک جایی است که متا کاراکتر ستاره در جستجو به دنبال قرائت‌های توالی RNA برای یافتن توالی‌هایی که 3’-polyadenylated هستند مورد استفاده قرار می‌گیرد. در این حالت از الگوی AAAAAA*$ استفاده می‌کنیم. این regex می‌تواند دقیقاً 5 A را که پس از آن صفر یا چند A دیگر آمده است شناسایی کند. متا کاراکتر + شبیه به * است به جز این که می‌تواند کاراکتر را یک یا چند بار پیدا کند. متا کاراکتر؟ کاراکتر یا گروه کاراکترهای قبلی را که صفر یا یک بار آمده باشد پیدا می‌کند.

اگر این الزام وجود داشته باشد که به صورت دقیق عمل کنیم و تنها تعداد خاصی از تکرارها مجاز باشند، می‌توانیم از نمادگذاری آکولاد نیز بهره بگیریم. یک عدد منفرد درون آکولاد دقیقاً با تعداد تکرارهای کاراکتر یا گروه مذکور مطابقت می‌یابد. برای نمونه CA{3}GATT با CAAAGATT مطابقت می‌یابد، اما با CAAGATT یا CAAAAGATT مطابقت پیدا نمی‌کند. برای تعیین یک بازه می‌توان از همان ساختار آکولاد استفاده کرد و از یک الگوی عمومی به صورت {n, x} برای یافتن کاراکتر یا گروه‌هایی که منحصراً بین n و x بار وجود دارند بهره گرفت. برای نمونه TCG{2, 4}A با الگوهای TCGGA ،TCGGGA و TCGGGA مطابقت دارد، اما با TGCA یا TCGGGGGA تطبیق پیدا نمی‌کند. خلاصه‌ای از این متا کاراکترها را می‌توانید در جدول زیر مشاهده کنید.

عبارت های منظم در پایتون

تطبیق یک الگو

از ماژول re برای نوشتن عبارت‌های منظم یا regex در پایتون استفاده می‌شود. برای بارگذاری این ماژول باید از گزاره import استفاده کنیم. بدین ترتیب باید خط کد زیر در ابتدای کد قرار گیرد:

Import re

برای استفاده از ابزاری از ماژول عبارت منظم، لازم است که در ابتدای آن نام ماژول را بیاوریم. ساده‌ترین تابع عبارت منظم ()re.serch است که تعیین می‌کند یک عبارت منظم جایی درون رشته وجود دارد یا نه. این تابع 2 آرگومان می‌گیرد که هر دو رشته هستند. آرگومان اول الگویی است که می‌خواهیم به دنبال آن بگردیم و آرگومان دوم رشته‌ای است که می‌خواهیم در آن جستجو شود. برای روشن‌تر شدن موضوع، در مثال زیر 2 آرگومان را به صورت آرگومان‌های کلیدواژه گنجانده‌ایم. معمولاً لزومی به گنجاندن این آرگومان‌های کلیدواژه وجود ندارد، اما ما برای کامل بودن مثال نسخه ساختار جایگزین را نیز به صورت کامنت شده ارائه کرده‌ایم.

در مثال ساده‌ای که در کد زیر نمایش یافته، به دنبال وجود یک تکرار سه نوکلئوتیدی از باز A درون تغییر DNA هاردکد شده می‌گردیم:

1import re
2
3DNA = 'GAGCGCTAGCCAAA'
4match = re.search(pattern='AAA', string=DNA)
5# match = re.search('AAA', 'DNA')
6print(match)
7
8<re.Match object; span=(11, 14), match='AAA'>

خروجی اغلب فراخوانی‌های تابع re یک شیء تطبیق یافته است اگر به دنبال تطبیق شیء فوق باشیم می‌توانیم تعیین کنیم که آیا تطبیق وجود دارد یا نه. این span اندیس رشته‌ای که تطبیق رخ داده را نشان می‌دهد و match نیز رشته دقیقی که تطبیق یافته را معرفی می‌کند. جستجوی یک عبارت منظم می‌تواند به عنوان بخشی از گزاره شرطی نیز استفاده شود:

1import re
2DNA = 'GAGCGCTAGCCAAA'
3if re.search('AAA', DNA):
4    print("Tri-nucleotide found!")
5
6#console output
7# Tri-nucleotide found!

استخراج مقادیر شیء match

در اغلب موارد در اسکریپت‌ها می‌خواهیم نه تنها تعیین کنیم که آیا یک تطبیق رخ داده یا نه، بلکه بدانیم که این تطبیق دقیقاً در کجا رخ داده است. همچنین ممکن است بخواهیم خود مورد تطبیق یافته را استخراج کنیم. خوشبختانه پایتون امکان استخراج مقادیر شیء match از قبیل موقعیت اندیس تطبیق و رشته دقیق که تطبیق یافته را به آسانی ارائه کرده است. این کار از طریق استفاده از چند متد روی شیء match میسر شده است:

1import re
2DNA = 'GAGCGCTAGCCAAA'
3match = re.search('AAA', DNA)
4
5print(match.start())
6#11
7print(match.end())
8#14
9print(match.span())
10# (11,14)
11print(match.group())
12# AAA
13# if we call the group method on the result of a regex search
14# we get the portion of the string that matched the input string
15# that matched the pattern

دستکاری و گروه‌های کاراکتر

تابع ()re.search می‌تواند برای یافتن الگوهای انعطاف‌پذیر نیز استفاده شود. به عنوان مثال آنزیم محدودسازی NCII الگوی توالی نوکلئوتید CCSGG را شناسایی می‌کند که کد نوکلئوتید S می‌تواند C یا G باشد. در این حالت به جای نوشتن و جستجوی دو عبارت منظم، می‌توانیم این تفاوت را با استفاده از alteration پیدا کنیم. در این مثال به جای ارائه چند جایگزین متفاوت کافی است تغییرات را درون پرانتز بنویسیم و آن‌ها را با استفاده از یک کاراکتر | از هم جدا کنیم. کاراکتر پایپ (|) به نام عملگر alternation نیز شناخته می‌شود.

1DNA = 'ATCGACCGGGTTT'
2if re.search('CCGGG', DNA) or re.search('CCCGG', DNA):
3    print('Restriction enzyme found!')
4
5if re.search('CC(G|C)GG', DNA):
6    print('Restriction enzyme found!')

کاربرد گروه‌های alternation از توانایی‌شان برای استفاده به عنوان واحدهای تکرار ناشی می‌شود. برای نمونه برای شناسایی این نکته استفاده شود که یک توالی به وسیله یک codon آغاز و یا خاتمه یافته است. بنابراین قابلیت این را دارد که یک «فریم قرائت باز» باشد و می‌توانیم عبارت منظم زیر را بنویسیم:

1open_reading_frame = 'AUG.*(AA|AG|GA)'

این regex به دنبال UAA ،UAG و UGA در انتهای توالی می‌گردد. برای بهبود این regex و اطمینان یافتن از این که آغاز و پایان codon در یک قاب قرار دارند، می‌توانیم regex را به صورت زیر تغییر دهیم:

1inframe_open_reading_frame = 'AUG(...)*U(AA|AG|GA)'

کد فوق بررسی می‌کند که آیا همه کاراکترها بین آغاز و خاتمه codon ضریبی از 3 هستند یا نه.

گروه‌های کاراکتر

گروه‌های کاراکتر نیز می‌توانند برای به دست آوردن تغییرات درون یک الگوی منفرد استفاده شوند. توالی‌های سایت N-glycosylation را در پروتئین‌ها در نظر بگیرید. این موتیف توالی دارای الگوی زیر است:

  • Asn که در ادامه هر چیز به جز Pro آمده و سپس یا Ser یا Thr و در ادامه هر چیزی به جز Pro آمده است.

با استفاده از کدهای اسیدآمینه تک‌حرفی متناظر به همراه گروه‌های کاراکتر می‌توان این الگو را به صورت زیر نوشت:

1N_glycosylation_pattern = 'N[^P][ST][^P]'

این الگو کد تک‌حرفی N را که در ادامه هر کاراکتری به جز P آمده و در ادامه یا یک S یا یک T آمده و سپس هر کاراکتری به جز یک P آمده شناسایی می‌کند. یک جفت آکولاد به همراه لیستی از کاراکترهای درون آن‌ها می‌توانند هر یک از این کاراکترها را نمایش دهند.

1import re
2
3N_glycosylation_pattern = 'N[^P][ST][^P]'
4# putting a caret ^ at the start of the group will negate it
5# and match any character that is not in that group
6
7Protein_seq = 'YHWKYELIQNNSNEFC'
8
9if re.search(N_glycosylation_pattern, Protein_seq):
10    print("N-glycosylation site motif found")
11else:
12    print("No motif found")

توان regex

قدرت واقعی regex زمانی مشخص می‌شود که هم این ابزارها با هم استفاده شوند. سناریوی زیر را در نظر بگیرید. بسیاری از ناهنجاری‌های ناباروری ارثی انسان مانند بیماری هانتینگتون (HD) با گسترش ناهنجاری در تعداد تکرارهای سه نوکلئوتیدی در ژن‌های خاص مرتبط هستند. شدت پاتولوژیکی HD با تعداد تکرارهای CAG-ها در exon-1 مربوط به ژن htt که هانتینگتون پروتئین را کدگذاری می‌کند مرتبط است. در بیماری هانتینگتون تعداد بالای تکرارها به معنی حمله زودتر بیماری و گسترش سریع‌تر آن است. کدون CAG میزان گلوتامین را تعیین می‌کند و HD به دسته وسیعی از بیماری‌های پلو گلوتامین ارتباط دارد. نمونه‌های سالم این ژن بین 6 تا 35 تکرار تاندم را نمایش می‌دهند، در حالی که وجود بیش از 35 تکرار به طور ضمنی وجود بیماری را تضمین می‌کند.

می‌توان از regex برای کدگشایی از تعداد تکرار پلی گلوتامین استفاده کرد. این کار در ابتدا نیازمند نوشتن الگویی برای یافتن تعداد تکرار سه نوکلئوتیدی‌ها در بالاتر از یک آستانه مشخص است.

1htt_pattern = '(CAG|CAA){18,}'
2
3# just like with substrings we can leave out the lower and upper limits
4# here, we will match the pattern 18 or more times

کدون CAA نیز گلوتامین را کدگذاری می‌کند و از این رو در htt_pattern فوق باید از عملگر alternation یعنی | استفاده کنیم. سپس می‌توانید از آکولادها که در بخش قبل توضیح دادیم برای تعیین تعدادی که می‌خواهیم پیدا کنیم بهره بگیریم. در اینجا ما تعداد 18 یا بیشتر را انتخاب کرده‌ایم که عامدانه حد بالایی را خالی گذاشته‌ایم.

ما نخست پایگاه داده نوکلئوتید NCBI را به دنبال توالی mRNA به نام htt گشتیم و آن را در دایرکتوری کاری دانلود کردیم. سپس این توالی را خواندیم و از الگوی خود برای تعیین طول تکرارهای تاندم گلوتامین که بالاتر از 18 هستند استفاده کردیم. برای روشن‌تر شدن روش کار، موارد تطبیق در فایل FASTA مربوط به NCBI هایلایت شده‌اند. همچنین از تابع ()re.dindall به جای ()re.search استفاده کردیم که تنها یک رخداد را پیدا می‌کند و در این حالت می‌توان تعداد موارد موجود را شناسایی کرد.

1import re
2
3htt_pattern = '(CAG|CAA){18,}'
4htt_mRNA = open('C:/Users/apsciuser/Downloads/htt_gene.fasta').read()
5match = re.findall(htt_pattern, htt_mRNA)
6print("The number of polyQ repeats found are: " + str(len(match)))
7
8# Console output
9# The number of polyQ repeats found are: 1

سخن پایانی

در این راهنما مقدمه کوتاهی در مورد شیوه استفاده از regex در رشته علوم ژنتیک ارائه کردیم. دانشی که در زمینه regex به دست می‌آید قابلیت انتقال بالایی دارد. به طور خاص اشکال ساختاری و کارکردهای مختلف در پایتون و بسیاری از زبان‌های برنامه‌نویسی عمده دیگر مانند پرل و R مشابه هستند.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *