使用python正则表达式在字符串中搜索长度为6或更长的特定重复(mnr)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python正则表达式在字符串中搜索长度为6或更长的特定重复(mnr)相关的知识,希望对你有一定的参考价值。
我有一个制表符分隔的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或gtAAAAAAAAAA或aaaaaaAAA或aaaaaaaaa或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
答案
要查找具有至少6个重复字符的序列,您可以使用捕获组和后引用。
[atcg]*([atcg])1{5}[atcg]*
这将匹配:
[atcg]*
匹配字符类中列出的任何0+次([atcg])1{5}
在第1组中捕获与任何列出的匹配,并重复对组1的反向引用5次[atcg]*
匹配字符类中列出的任何0+次
您可以使用csv阅读器并选择逗号作为分隔符(因为您声明这是分隔符,请注意示例数据中没有逗号)
如果它是一个标签,你可以使用' '
作为分隔符
如果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) + "
")
seqout.close()
另一答案
你的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)
以上是关于使用python正则表达式在字符串中搜索长度为6或更长的特定重复(mnr)的主要内容,如果未能解决你的问题,请参考以下文章