Статьи

Рубин на медицине: охота за последовательностью генов

Предыдущие статьи этой серии были посвящены обработке очень больших текстовых файлов. В какой-то момент вас может заинтересовать поиск определенного шаблона в этих больших файлах. Ручной поиск по большому текстовому файлу не является началом, поэтому использование невероятных инструментов торговли разработчика — вот куда мы обращаемся за помощью в сегодняшней статье.

Регулярные выражения

Регулярные выражения (Regex) созданы для этой задачи. Они представляют собой закодированные текстовые строки, ориентированные на сопоставление и управление шаблонами в тексте. Они родились в нашем мире в 1970-х годах. Они чрезвычайно полезны и считаются ключом к мощной обработке текста.

Точнее, регулярное выражение — это строка, которая содержит комбинацию нормальных символов и специальных метасимволов. Нормальные символы присутствуют, чтобы соответствовать себе. С другой стороны, метасимволы представляют такие идеи, как количество и расположение символов.

Regex — это сам по себе язык со специальным синтаксисом и инструкциями для реализации. Он может использоваться с языками программирования, такими как Ruby, для решения различных задач, таких как:

  • Поиск текста, который соответствует шаблону в более крупном тексте ( т.е. наш очень большой текстовый файл)
  • Замена текста, соответствующего шаблону, другим текстом
  • Например, поиск файла, содержащего текстовый муравей , но не, если этот текст находится в конце слова ( т.е. хочет)

Это лишь некоторые из примеров возможных задач. Такие задачи могут варьироваться по сложности от простой команды поиска текстового редактора до мощного языка обработки текста.

Суть в том, что вы, как программист Ruby, будете вооружены очень универсальным инструментом, который можно использовать для выполнения всевозможных задач обработки текста.

Сегодняшний пример будет сфокусирован на основных типах задач, которые выполняет regex: Поиск (найти текст) и Заменить (редактировать найденный текст).

Поиск с помощью Regex

Регулярное выражение удобно при поиске текста, особенно когда текст не является простым совпадением. Как мы упоминали выше, вам может быть интересно найти текст == ant ==. Это просто Но когда значение == ant == имеет значение, такое, что вы хотите ant, но не хотите , regex является идеальным.

Замена на Regex

Замена в регулярном выражении — это сила, которая должна быть добавлена ​​к возможностям поиска регулярного выражения. Примером, когда замена может потребоваться, является случай, когда вы хотите заменить извлеченные (найденные) URL-адреса на интерактивные URL-адреса, то есть URL-адрес, имеющий атрибут HTML href .

Вкус Regex

Давайте сделаем несколько простых примеров с регулярным выражением, чтобы согреться. Вы можете использовать эти таблицы в качестве ссылки для некоторых метасимволов, которые мы будем использовать. Кроме того, для проверки регулярных выражений используйте Rubular , онлайновый редактор регулярных выражений на основе Ruby, для тестирования регулярных выражений.

Пример № 1

Давайте возьмем это регулярное выражение, например:

/a[cnr]t/ 

Это регулярное выражение говорит нам, чтобы найти шаблон, где текст начинается с буквы a , заканчивается буквой t , а средняя буква — это c , n , r .

Таким образом, совпадающими словами в данном случае являются act , ant и art .

Тестирование в Rubular выглядит примерно так:

Rubular

Пример № 2

Давайте возьмем это регулярное выражение, например:

 ^Here 

Это регулярное выражение соответствует любой строке, которая начинается здесь . Метасимвол обводного акцента ( ^ ) заставляет шаблон начинать со следующего, в данном случае Here . Например, если у вас есть строка Here is the book _, она сопоставляется с использованием приведенного выше регулярного выражения.

Пример № 3

 book.$ 

Это регулярное выражение будет соответствовать строке, которая заканчивается на книге. , Метасимвол знака доллара заставляет образец заканчиваться тем, что ему предшествует. Например, строка Вот книга. соответствует этому регулярному выражению.

Пример № 4

 book 

Это соответствует строке, в которой есть слово book . Например, эта строка будет сопоставлена ​​с помощью этого регулярного выражения «Книга на столе» .

Пример № 5

 ^[AZ][az]+\s[0-9]* 

Вау! Что это??? Не волнуйтесь, это регулярное выражение выглядит страшно, но не так сложно. Это регулярное выражение говорит нам о том, чтобы найти строку, которая начинается с заглавной буквы ( [AZ] ), за которой следуют одна или несколько строчных букв ( [az]+ ), за которыми следует пробел ( \s ) и заканчивает один или более цифр ( [0-9] ). Скобки ( [] ) обозначают диапазон, то есть соответствуют чему-либо в этом диапазоне. Знак + после указывает на одно или несколько совпадений непосредственно предшествующего выражения.

Примером подходящей строки для этого выражения является Ali 2015 .

Конечно, существует множество способов написания регулярных выражений, и это только некоторые примеры.

Охота на последовательность генов

Ген состоит из длинной комбинации четырех различных нуклеотидных оснований, при условии, что у нас есть тысячи генов. Четыре нуклеотида:

  • А (аденин)
  • C (цитозин)
  • G (гуанин)
  • Т (тимин)

Различные комбинации этих нуклеотидов дают нам разные характеристики.

В большом файле (из предыдущих битов этой серии) вы увидите длинный список последовательностей генов. Вот очень маленький снимок того, что включено в файл!

 AGGCTTCGATGCCCCTCCACACCCTCTTGATCTTCCCTGTGATGTCATCT GGAGCCCTGCTGCTTGCGGTGGCCTATAAAGCCTCCTAGTCTGGCTCCAA GGCCTGGCAGAGTCTTTCCCAGGGAAAGCTACAAGCAGCAAACAGTCTGC ATGGGTCATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCAGGGGCCCCCA AGAAAGGCTCTGGTGGAGAACCTGTGCATGAAGGCTGTCAACCAGTCCAT AGGCAAGCCTGGCTGCCTCCAGCTGGGTCGACAGACAGGGGCTGGAGAAG GGGAGAAGAGGAAAGTGAGGTTGCCTGCCCTGTCTCCTACCTGAGGCTGA GGAAGGAGAAGGGGATGCACTGTTGGGGAGGCAGCTGTAACTCAAAGCCT TAGCCTCTGTTCCCACGAAGGCAGGGCCATCAGGCACCAAAGGGATTCTG CCAGCATAGTGCTCCTGGACCAGTGATACACCCGGCACCCTGTCCTGGAC ACGCTGTTGGCCTGGATCTGAGCCCTGGTGGAGGTCAAAGCCACCTTTGG TTCTGCCATTGCTGCTGTGTGGAAGTTCACTCCTGCCTTTTCCTTTCCCT AGAGCCTCCACCACCCCGAGATCACATTTCTCACTGCCTTTTGTCTGCCC AGTTTCACCAGAAGTAGGCCTCTTCCTGACAGGCAGCTGCACCACTGCCT GGCGCTGTGCCCTTCCTTTGCTCTGCCCGCTGGAGACGGTGTTTGTCATG GGCCTGGTCTGCAGGGATCCTGCTACAAAGGTGAAACCCAGGAGAGTGTG GAGTCCAGAGTGTTGCCAGGACCCAGGCACAGGCATTAGTGCCCGTTGGA GAAAACAGGGGAATCCCGAAGAAATGGTGGGTCCTGGCCATCCGTGAGAT CTTCCCAGGGCAGCTCCCCTCTGTGGAATCCAATCTGTCTTCCATCCTGC GTGGCCGAGGGCCAGGCTTCTCACTGGGCCTCTGCAGGAGGCTGCCATTT GTCCTGCCCACCTTCTTAGAAGCGAGACGGAGCAGACCCATCTGCTACTG CCCTTTCTATAATAACTAAAGTTAGCTGCCCTGGACTATTCACCCCCTAG TCTCAATTTAAGAAGATCCCCATGGCCACAGGGCCCCTGCCTGGGGGCTT GTCACCTCCCCCACCTTCTTCCTGAGTCATTCCTGCAGCCTTGCTCCCTA ACCTGCCCCACAGCCTTGCCTGGATTTCTATCTCCCTGGCTTGGTGCCAG TTCCTCCAAGTCGATGGCACCTCCCTCCCTCTCAACCACTTGAGCAAACT CCAAGACATCTTCTACCCCAACACCAGCAATTGTGCCAAGGGCCATTAGG CTCTCAGCATGACTATTTTTAGAGACCCCGTGTCTGTCACTGAAACCTTT TTTGTGGGAGACTATTCCTCCCATCTGCAACAGCTGCCCCTGCTGACTGC CCTTCTCTCCTCCCTCTCATCCCAGAGAAACAGGTCAGCTGGGAGCTTCT GCCCCCACTGCCTAGGGACCAACAGGGGCAGGAGGCAGTCACTGACCCCG AGACGTTTGCATCCTGCACAGCTAGAGATCCTTTATTAAAAGCACACTGT TGGTTTCTGCTCAGTTCTTTATTGATTGGTGTGCCGTTTTCTCTGGAAGC CTCTTAAGAACACAGTGGCGCAGGCTGGGTGGAGCCGTCCCCCCATGGAG CACAGGCAGACAGAAGTCCCCGCCCCAGCTGTGTGGCCTCAAGCCAGCCT TCCGCTCCTTGAAGCTGGTCTCCACACAGTGCTGGTTCCGTCACCCCCTC CCAAGGAAGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCCATGTCAGAGC AACGGCCCAAGTCTGGGTCTGGGGGGGAAGGTGTCATGGAGCCCCCTACG ATTCCCAGTCGTCCTCGTCCTCCTCTGCCTGTGGCTGCTGCGGTGGCGGC AGAGGAGGGATGGAGTCTGACACGCGGGCAAAGGCTCCTCCGGGCCCCTC ACCAGCCCCAGGTCCTTTCCCAGAGATGCCTGGAGGGAAAAGGCTGAGTG AGGGTGGTTGGTGGGAAACCCTGGTTCCCCCAGCCCCCGGAGACTTAAAT ACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGG CAGCGGCCCTGCCTCCTACCCTTGCGCCTCATGACCAGCTTGTTGAAGAG ATCCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTGCAACGGGAA 

Допустим, нам нужна та последовательность генов, которая начинается с CTGA и заканчивается CACT . Между этими двумя паттернами мы хотим либо A , C , либо T.

В руководстве по работе с большими файлами мы решили проблему открытия большого файла. Итак, теперь вы можете видеть содержимое в таком большом файле, но можете ли вы найти шаблон вручную? Бьюсь об заклад, вам будет очень трудно сделать это.

Regex на помощь! Это было бы простой задачей с использованием регулярных выражений. Для такого шаблона мы можем просто сказать Ruby, что мы хотим получить следующее:

 CTGA(A|C|T)CACT 

Рубин и Регекс

Ruby — очень удобный язык для выражений. Сценарий Ruby, который соответствует последовательности гена, которую мы хотим, выглядит следующим образом:

 puts 'Enter the filename you want to search, and hit ENTER' filename = gets.chomp puts 'Enter the regular expression you want to match, and hit ENTER' regular_expression = gets.chomp input_file = File.open(filename,'r') output_file = 'result.txt' output_file = File.open(output_file,'w') input_file.each_line do |regex| if (regex =~ /#{regular_expression}/) output_file.print regex end end exit 

Это утверждение /#{regular_expression}/ выражение /#{regular_expression}/ создает регулярное выражение на лету из содержимого regular_expression выражения, которое мы получаем от пользователя. =~ — это оператор сопоставления с образцом в Ruby, описываемый документами Ruby как:

= ~ основной оператор сопоставления с образцом в Ruby. Если один операнд является регулярным выражением, а другой — строкой, то регулярное выражение используется в качестве шаблона для сопоставления со строкой. (Этот оператор эквивалентно определяется Regexp и String, поэтому порядок String и Regexp не имеет значения. Другие классы могут иметь различные реализации = ~.) Если совпадение найдено, оператор возвращает индекс первого совпадения в строке, в противном случае он возвращает ноль

Запуск сценария

Снимок ниже показывает команды, используемые для запуска скрипта:

Терминал

При успешном выполнении программы создается файл с именем result.txt, в котором отображаются строки, в которых выполняется сопоставление с образцом. Вы можете посмотреть мою версию result.txt здесь .

Больше регулярных выражений …

Если вы хотите углубиться в регулярные выражения, я бы порекомендовал книгу « Освоение регулярных выражений » О’Рейли.

Счастливого Рубин и регулярных выражений!