поиск определенных повторений (mnr) длиной 6 или более в строке с использованием регулярного выражения python - PullRequest
2 голосов
/ 04 апреля 2019

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

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

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

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

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

mnr повторов подряд будет выглядеть примерно так: AAAAaaAAgtc или gtAAAAAAAAAAc, или aaaaaaAAA, или aaaaaaaaa, или ccccccccccc, или ccccccccccc, или CCCCCcccCCC или ...

1011но не работает:
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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

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

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

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

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

Regex demo

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

Если это вкладка, вы можете использовать '\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()
0 голосов
/ 04 апреля 2019

Ваш 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...