使用 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+次
您可以使用 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()
我有一个制表符分隔的 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+次
您可以使用 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()