#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 какой шаблон для вашего вывода? Как добавляется заголовок и хвост? Я просто вижу шаблон повторяющейся последовательности, но не могу найти, чтобы управлять выводом.