Я особенно смотрю на R, Perl и shell. Но любой другой язык программирования тоже будет хорош.
Вопрос
Есть ли способ визуально или программно проверять и индексировать строку с сопоставлением на основе регулярного выражения? Это предназначено для ссылки на первое регулярное выражение и его результаты внутри второго регулярного выражения, чтобы иметь возможность изменять часть согласованной строки и писать новые правила для этой конкретной части.
https://regex101.com визуализирует, как определенная строка соответствует регулярному выражению. Но он далек от совершенства и не эффективен для моего огромного набора данных.
ПРОБЛЕМА
У меня есть около 12000 согласованных строк (последовательности ДНК) для моего первого регулярного выражения, и я хочу обработать эти строки и на основе некоторых строгих правил найти некоторые другие строки во втором файле, которые хорошо сочетаются с этими 12000 матчами на основе этих строгие правила.
УПРОЩЕННЫЙ ПРИМЕР
Это мое первое регулярное выражение (упрощенная, более короткая версия моего исходного регулярного выражения), которая проходит через мой первый текстовый файл.
[ACGT]{1,12000}(AAC)[AG]{2,5}[ACGT]{2,5}(CTGTGTA)
Предположим, что он находит следующие три подстроки в моем большом текстовом файле:
1. AAACCCGTGTAATAACAGACGTACTGTGTA
2. TTTTTTTGCGACCGAGAAACGGTTCTGTGTA
3. TAACAAGGACCCTGTGTA
Теперь у меня есть второй файл, который включает очень большую строку. Из этого второго файла я заинтересован только в извлечении этих подстрок, которые соответствуют новому (второму) регулярному выражению, которое само зависит от моего первого регулярного выражения в нескольких разделах. Поэтому это второе регулярное выражение должно учитывать подстроки, согласованные в первом файле, и посмотреть, как они совпадали с первым регулярным выражением!
Позвольте мне, для простоты, индексировать мое первое регулярное выражение для лучшей иллюстрации следующим образом:
first.regex.p1 = [ACGT]{1,12000}
first.regex.p2 = (AAC)
first.regex.p3 = [AG]{2,5}
first.regex.p4 = [ACGT]{2,5}
first.regex.p5 = (CTGTGTA)
Теперь мое второе (новое) регулярное выражение, которое будет искать второй текстовый файл и будет зависеть от результатов первого регулярного выражения (и как подстроки, возвращаемые из первый файл соответствует первому регулярному выражению) будет определяться следующим образом:
second.regex = (CTAAA)[AC]{5,100}(TTTGGG){**rule1**} (CTT)[AG]{10,5000}{**rule2**}
Здесь правило1 и правило2 зависят от совпадений, исходящих из первого регулярного выражения в первом файле. Следовательно,
rule1 = look at the matched strings from file1 and complement the pattern of first.regex.p3 that is found in the matched substring from file1 (the complement should of course have the same length)
rule2 = look at the matched strings from file1 and complement the pattern of first.regex.p4 that is found in the matched substring from file1 (the complement should of course have the same length)
Вы можете видеть, что во втором регулярном выражении есть разделы, принадлежащие самому себе (то есть они не зависят от какого-либо другого файла/регулярного выражения), но также имеют разделы, зависящие от результатов первого файла и правил первого регулярного выражения и как каждая подстрока в первом файле совпадает с первым регулярным выражением!
Теперь для простоты я использую третью подобранную подстроку из файла1 (потому что она короче двух других), чтобы показать вам, как выглядит возможное совпадение со вторым файлом и как оно удовлетворяет второму регулярному выражению:
Это то, что мы получили из нашего первого регулярного выражения, запускаемого через первый файл:
3. TAACAAGGACCCTGTGTA
Итак, в этом матче мы видим, что:
T has matched first.regex.p1
AAC has matched first.regex.p2
AAGGA has matched first.regex.p3
CC first.regex.p4
CTGTGTA has matched first.regex.p5
Теперь в нашем втором регулярном выражении для второго файла мы видим, что при поиске подстроки, соответствующей второму регулярному выражению, мы зависим от результатов, поступающих из первого файла (которые соответствуют первому регулярному выражению). В частности, нам нужно посмотреть согласованные подстроки и дополнить части, которые соответствовали first.regex.p3 и first.regex.p4 ( rule1 и rule2 из second.regex).
complement means:
A will be substituted by T
T -> A
G -> C
C -> G
Итак, если у вас есть TAAA, то дополнением будет ATTT.
Поэтому вернемся к этому примеру:
- TAACAAGGACCCTGTGTA
Нам нужно дополнить следующее, чтобы удовлетворить требованиям второго регулярного выражения:
AAGGA has matched first.regex.p3
CC first.regex.p4
И дополнения:
TTCCT (based on rule1)
GG (based on rule2)
Итак, пример подстроки, которая соответствует second.regex, такова:
CTAAAACACCTTTGGG TTCCT CTTAAAAAAAAAGGGGGAGAGAGAAGAAAAAAAGAGAG GG
Это только один пример! Но в моем случае у меня есть 12000 подстрочных подстрок!! Я не могу понять, как подойти к этой проблеме. Я пробовал писать чистое регулярное выражение, но я полностью не смог реализовать что-либо, что должным образом следует этой логике. Может быть, я не должен даже использовать регулярное выражение?
Можно ли сделать это полностью с помощью регулярного выражения? Или я должен взглянуть на другой подход? Возможно ли индексировать регулярное выражение и во втором справочнике регулярных выражений назад к первому регулярному выражению и заставить регулярное выражение рассматривать согласованные подстроки, возвращаемые первым регулярным выражением?