Рестрикционные сайты и неоднозначные мотивы

Многие биологические мотивы не точны: «G, затем пурин, затем T». Такие паттерны ищут регулярными выражениями.

Рестрикционный сайт — короткая (обычно палиндромная) последовательность, которую узнаёт и разрезает фермент-рестриктаза. Поиск таких сайтов — классическая задача молекулярного клонирования.

Рестриктазы — «молекулярные ножницы», основа генной инженерии. Чтобы спланировать клонирование, нужно знать, где фермент разрежет ДНК. Часть сайтов точные (EcoRI = GAATTC), часть допускают варианты — и тут на сцену выходят IUPAC-коды и регулярки.

Поиск точного рестрикционного сайта

def find_sites(seq, site):
    positions = []
    i = seq.find(site)
    while i != -1:
        positions.append(i + 1)  # 1-based, как принято у биологов
        i = seq.find(site, i + 1)
    return positions

plasmid = 'GAATTCAAAGAATTCGGCC'
print('EcoRI (GAATTC) в позициях:', find_sites(plasmid, 'GAATTC'))

Вывод:

EcoRI (GAATTC) в позициях: [1, 10]

Неоднозначность: коды IUPAC

Некоторые ферменты узнают семейство сайтов. Чтобы записать «любой пурин», используют коды IUPAC: R = A или G, Y = C или T, N = любой, W = A или T, S = G или C. Переведём IUPAC-мотив в регулярное выражение.

КодЗначитРегулярка
RA или G (пурин)[AG]
YC или T (пиримидин)[CT]
SG или C[GC]
WA или T[AT]
Nлюбой[ACGT]
import re

IUPAC = {'A':'A','C':'C','G':'G','T':'T',
         'R':'[AG]','Y':'[CT]','S':'[GC]','W':'[AT]','N':'[ACGT]'}

def motif_to_regex(motif):
    return ''.join(IUPAC[b] for b in motif)

seq = 'AAGAATTCGGGAGTTCCCGACTTC'
pattern = motif_to_regex('GASTTC')  # S = G или C
print('Регулярка:', pattern)
for m in re.finditer(pattern, seq):
    print(f'  {m.group()} в позиции {m.start()}')

Вывод:

Регулярка: GA[GC]TTC
  GAGTTC в позиции 10
  GACTTC в позиции 18

Мотив GASTTC превратился в регулярку GA[GC]TTC и нашёл оба варианта — GAGTTC и GACTTC. Так один компактный паттерн покрывает семейство сайтов.

Регулярные выражения в биоинформатике мощны, но требуют осторожности из-за специфики алфавита. У строгих биологических мотивов часто есть позиции «строго такая буква» и позиции «что угодно», и удобно описывать их таблицей частот, а не одной регуляркой, — это так называемые позиционно-весовые матрицы (PWM), которыми моделируют сайты связывания. Регулярка отвечает на вопрос «да или нет» (подходит сайт или нет), а PWM даёт оценку «насколько хорошо подходит», что ближе к биологической реальности, где сайты бывают сильными и слабыми. Регулярки — отличный первый инструмент, а PWM — следующий шаг, когда нужна градация. Помните и про производительность: сложная регулярка с множеством альтернатив может работать медленно на геномных масштабах, поэтому для частых запросов мотив сначала загрубляют до точного ядра, ищут его быстро, а полную проверку делают лишь вокруг кандидатов.

Перекрытия в регулярках

Важная тонкость: re.finditer по умолчанию не находит перекрывающиеся совпадения — найдя одно, движок продолжает после него. Для перекрывающихся паттернов используют lookahead-приём, но это уже тонкость; помните о нём, когда мотив может накладываться сам на себя.

Как работает под капотом: почему сайты палиндромны

Многие рестрикционные сайты равны своему обратному комплементу (мы видели это в разделе про комплемент). Причина — симметрия фермента: рестриктаза часто состоит из двух одинаковых половин, каждая узнаёт свою нить. Поэтому сайт «читается одинаково» на обеих нитях, и фермент режет симметрично. Это значит, что искать палиндромный сайт достаточно на одной нити — на второй он в той же позиции.

Стоит увидеть и практическую цель всего этого — карту рестрикции. Прежде чем разрезать плазмиду и вставить нужный ген, молекулярный биолог строит карту: где какой фермент режет и на какие фрагменты распадётся молекула. Имея функцию поиска сайтов, такую карту легко посчитать программно для целого набора ферментов сразу: пройтись по словарю «фермент → сайт», для каждого найти позиции разрезов и отсортировать. Получается готовый план эксперимента. Именно это делают популярные инструменты вроде NEBcutter, и теперь вы понимаете, что у них внутри — тот же поиск подстроки, что мы написали, плюс база сайтов сотен ферментов.

Частые ошибки

  • Забыть про IUPAC. Записать неоднозначный мотив как точный — значит пропустить половину сайтов.
  • Ждать перекрытий от finditer. По умолчанию он их не даёт.
  • Путать 0-based и 1-based. Биологи нумеруют с 1; решите, в каких координатах выводить, и будьте последовательны.

Итог

  • Точные сайты ищут поиском подстроки; неоднозначные — регулярками.
  • Коды IUPAC (R, Y, N, ...) кодируют наборы букв и переводятся в классы символов регулярки.
  • re.finditer не находит перекрывающиеся совпадения по умолчанию.
  • Палиндромность сайтов отражает симметрию ферментов и позволяет искать на одной нити.
Проверьте себя
1. Что обозначает код IUPAC R в последовательности ДНК?
AТолько A
BA или G (пурин)
CЛюбой нуклеотид
DC или T
2. Во что превращается мотив GASTTC (S = G или C) как регулярное выражение?
AGASTTC
BGA[GC]TTC
CGA[AT]TTC
DG[ACGT]STTC
3. Находит ли re.finditer перекрывающиеся совпадения по умолчанию?
AДа, всегда
BНет, после найденного совпадения поиск продолжается за ним
CТолько для коротких паттернов
DТолько с флагом re.I