поиск определенных повторов (mnr) длиной 6 или более в строке с использованием регулярного выражения Python

#python #regex #bioinformatics

#python #регулярное выражение #биоинформатика

Вопрос:

У меня есть CSV-файл с разделителями табуляции, содержащий 3 поля, разделенных запятыми: номер, последовательность и статус. Каждая строка представляет другую последовательность.

пример входного файла, который называется sequences.txt:

 1 tgctccatatcagtgcagatcgcgcgatacattcctcagtaggaaaaaagttcagagatgataatcgtccgtccgggatttcagatgaaagaggctggaagtcaaggctttagcgggtaggaggttaatgatttt no 
2 tatactatttagttctgcagtgagccttcatacaaagggatgtggagttgtcatatggggggctctgtatccggagttcggttttgcttgagactcaaatcggggttttcgtacat no 
3 ccggctagtgagaggcttaagacatccagatatctcgaatagtaatagcagtcgaaaccgaaattaaaccccaatcactaatggcattcacataatgaatagtgcttactcgacctaagggcgaatt no 
4 ttaattgatttttgtgcaaaaattgatattagagtattacccccgtattgctatgcgcctttctaattgactgattacgtgagacgcgcgggtttggagttcactgggcagacgcgagctacatttgccaggtacgact yes
  

Я хочу написать программу для сканирования каждой последовательности и проверки наличия мономерных нуклеотидных повторов (mnr) из 6 или более (верхний или нижний регистр не имеет значения, я ищу оба). Если я нахожу последовательность, соответствующую этим критериям, я должен затем распечатать всю строку в новый выходной файл (со всеми 3 полями).

Определение: мономерные нуклеотиды — это: повторы A, T, C, G (регистр не чувствителен)

повторения mnr в строке будут примерно такими: AAAAaaAAgtc или GTAAAAAAAAAC или aaaaaaAAA или aaaaaaaaa или cccccccccccccccccc или…

Я пробовал эти регулярные выражения, но не работает:

 import csv
import re
with open('sequences.txt','r') as f:
    reader = csv.reader(f,delimiter=",")
    for line in reader:
        seq=re.findall(r'[Aa]{6, }',reader)
        if line.__contains__(seq):
            print(line)

with open('seqoutput.txt','w') as f:
    for line in list1:
        f.write(line)
  

ожидаемый результат:

 1 tgctccatatcagtgcagatcgcgcgatacattcctcagtaggaaaaaagttcagagatgataatcgtccgtccgggatttcagatgaaagaggctggaagtcaaggctttagcgggtaggaggttaatgatttt no 
2 tatactatttagttctgcagtgagccttcatacaaagggatgtggagttgtcatatggggggctctgtatccggagttcggttttgcttgagactcaaatcggggttttcgtacat no 
  

текущий вывод:

 Traceback (most recent call last):


File "sequence.py", line 6, in <module>
    seq=re.findall(r'[Aa]{6, }',reader)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 181, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
  

Комментарии:

1. for line in reader не является строкой. Это список. Ваше регулярное выражение в порядке.

2. Регулярное выражение подходит для a — вам нужно отсканировать остальные 3 оставшихся нуклеотида, используя аналогичное регулярное выражение

3. И вы ошибаетесь reader с фактической строкой.

4. @knh190 спасибо, так что я должен поместить вместо reader в строку for

5. Почему ваш вывод намного короче исходной строки последовательности?

Ответ №1:

Чтобы найти последовательность, содержащую не менее 6 повторяющихся символов, вы могли бы использовать группу захвата и обратную ссылку.

 [atcg]*([atcg])1{5}[atcg]*
  

Это будет соответствовать:

  • [atcg]* Сопоставьте любой из перечисленных в классе символов 0 раз
  • ([atcg])1{5} Захват в группе 1, соответствующей любому из перечисленных, и повторите обратную ссылку на группу 1 5 раз
  • [atcg]* Сопоставьте любой из перечисленных в классе символов 0 раз

Демонстрация регулярных выражений

Вы могли бы использовать программу чтения CSV и выбрать запятую в качестве разделителя (поскольку вы указываете, что это разделитель, обратите внимание, что в данных примера нет запятых)

Если это вкладка, которую вы могли бы использовать 't' в качестве разделителя

Если sequence часть совпадает, запишите строку в новый файл, используя тот же разделитель.

Ваш код может выглядеть следующим образом:

 import re
import csv

seqout = open('seqoutput.txt', 'a')
with open('sequences.txt','r') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        match = re.match(r'[atcg]*([atcg])1{5}[atcg]*', row[1])
        if match:
            seqout.write(','.join(row)   "n")
seqout.close()
  

Комментарии:

1. Я не понял эту часть? не могли бы вы уточнить подробнее: (‘,’.join (строка) » n»)

2. @NazaninShambayati У вас есть 3 столбца, а строка [1] — это второй столбец, содержащий sequence . row это список из 3 столбцов, и если вы хотите записать его в виде строки в файл, вам нужно собрать строку из элементов, используя запятую в качестве разделителя (','.join(row) "n")

3. Я на работе, поэтому я отвечаю поздно, я удалил свой первый комментарий … потому что, я думаю, я допустил ошибку в answer…it выдал мне результат, но я должен сравнить его.. Я вернусь к вам снова, потому что у меня также есть вопросы от regex .. огромное спасибо..

4. да, на самом деле это сработало… вы не знаете, насколько вы мне помогли .. честно говоря, я не понял часть регулярного выражения: ( какой раздел мне нужно изучить, чтобы получить его, или, если это возможно, можете ли вы объяснить мне, что вы сделали? Большое, большое спасибо 🙂

5. @NazaninShambayati Добро пожаловать, рад помочь! В ответе есть объяснение регулярного выражения, но происходит то, что есть 4 возможных символа для сопоставления [atcg]* , которые могут присутствовать перед повторяющимися символами. Вот почему вы используете * для повторения 0 раз. Чтобы получить повторяющиеся символы, сначала вам нужно записать один из этих символов в группу с помощью круглых скобок ([atcg]) и проверить, можете ли вы повторить то, что записано 5 раз. Чтобы получить ссылку на то, что записано, вы используете 1 и повторяете 5 раз, используя 1{5} . Затем сопоставьте символы, которые могут следовать, используя [atcg]*

Ответ №2:

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

 reader = csv.reader(f,delimiter=" ") # tab split
for row in reader:
    sequence = row[1]
    seq=re.findall(r'[Aa]{6, }', sequence) # not reader
  

Ваше регулярное выражение может быть расширено для других алфавитов:

 re.findall(r'[Aa|Gg|Cc|Tt]{6,}', sequence)
  

Комментарии:

1. это не сработало ..:(и что я должен напечатать в конце? Я хочу напечатать все строки, содержащие совпадения..

2. @NazaninShambayati что вы подразумеваете под «не сработало»? Мне нужно знать исключение и номер строки.

3. @NazaninShambayati какой шаблон для вашего вывода? Как добавляется заголовок и хвост? Я просто вижу шаблон повторяющейся последовательности, но не могу найти, чтобы управлять выводом.