使用python正则表达式在字符串中搜索长度为6或以上的特定重复(mnr)

时间:2019-04-04 03:36:24

标签: python regex bioinformatics

我有一个制表符分隔的csv文件,其中包含3个逗号分隔的字段:数字,序列和状态。每行代表一个不同的序列。

输入文件的示例,称为sequence.txt:

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

我想编写一个程序来扫描每个序列,并检查是否有6个或更多的单体核苷酸重复(mnr)(无论大写还是小写,我都需要查找)。如果找到符合该条件的序列,则应将整行打印到新的输出文件(包含所有3个字段)中。

定义:单体核苷酸是:A,T,C,G的重复(不区分大小写)

连续重复的mnr类似于:AAAAaaAAgtc或gtAAAAAAAAAAc或aaaaaaAAA或aaaaaaaaaa或ccccccccccc或CCCCCcccCCC或...

我尝试过此正则表达式,但不起作用:

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 :(得分:0)

您的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 :(得分:0)

要查找至少包含6个重复字符的序列,可以使用捕获组和反向引用。

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

这将匹配:

  • [atcg]*匹配0次以上的字符类别中的任何列表
  • ([atcg])\1{5}在第1组中捕获与列出的任何匹配项,并重复向第1组进行5次反向引用
  • [atcg]*匹配0次以上的字符类别中的任何列表

Regex demo

您可以使用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()