Честно говоря, это то, что вы хотите, это выражение регулярного выражения.Я не достаточно знаком с Python, но думаю, вы захотите распараллелить сканирование.Я сделал некоторую биоинформатику в C ++, но мы искали известные строки, и если вы использовали методы, основанные на хэше, 3 базы слишком малы, чтобы отключить imo, учитывая, что GGG будет иметь миллионы повторов в геноме.
import re
matches = re.search('GGG.{1,7}GGG.{1,7}GGG',genome)
Даже в этом случае не работает подход «скользящего окна».АКА, вы бы хотели, чтобы он возвращал 2 результата, если вход был GGG + N (1-7) + GGG + N (1-7) + GGG + N (1-7) + GGG заметить 3-й N (1-7)+ Повторение GGG?
Для этого вы, вероятно, захотите
import re
matches = re.search('GGG(.{1,7}GGG){2,}',genome)
, затем сделайте второй проход по результатам, чтобы найти их.Этот подход, хотя и «легкий», требует довольно много памяти, поскольку он создает подстроки, поэтому большие геномы сталкиваются с небольшой проблемой.
Следующая оптимизация - создание собственного анализатора паттернов, который не тратит впустую потраченные усилия.памяти и позволяет искать частичную подстроку без дублирования строковых данных.Наличие нескольких копий генома в памяти может быть невероятно дорогим, когда это несжатый текст.
Эта проблема хорошо подходит для многопоточности, хотя, если вы можете нацеливаться на подстроки геномов.