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

search for specific repeats (mnr) of length 6 or more in a string using python regular expression

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

一个名为 sequences.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

您的 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)

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

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

将匹配:

  • [atcg]* 匹配任意列出的字符class 0+次
  • ([atcg]){5} 在组 1 中捕获匹配任何列出的内容并重复对组 1 的反向引用 5 次
  • [atcg]* 匹配任意列出的字符class 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]){5}[atcg]*', row[1])
        if match:
            seqout.write(','.join(row) + "\n")
seqout.close()