我有一个RNA序列,看起来像这样每个字符代表一个核苷酸(程序员可以忽略这一点,您可以将它们视为元素):
(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....
我将使用这个术语来回答这个问题:
( = lhb
) = rhb
. = dot
因此本质上,具有lhb的元素与具有rhb的元素相连,所有的点都是自由区域,它们的连接方式是复杂的很难用文字表达,为了方便起见,我会在一些连接的元素下面加上数字:
(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....
1 2 2 3 3 45 5 4 1
我想这会让你知道他们是如何联系起来的我感兴趣的是找出连接元素的位置和自由区域。
(例如,元件1连接至元件72,元件8至9自由)。
我
选择C来编写代码,但我不接近逻辑。
另外,用C语言编程也变得越来越困难,我觉得用正则表达式或者perl在python中可以很容易地做到这一点,但我对这些语言没有太多的经验所以,如果有人能提供一个简单的方法,这将是一个巨大的帮助我们也欢迎改进C代码的想法这是我的C代码:-
#include <stdio.h>
int main() {
char dot[500];
int i = 0, j = 0;
int count = 0, count1 = 0, count2 = 0;
int lhb[100];
int rhb[100];
int dots[100];
int pair_1[100];
int pair_2[100];
int pair_3[100];
FILE * fp;
fp = fopen("structure.txt", "r");
while (fscanf(fp, "%c", & dot[i]) != EOF) {
i++;
}
fclose(fp);
for (i = 0; dot[i] != '\0'; i++) {
if (dot[i] == '(') {
lhb[count] = dot[i];
pair_1[count] = i;
count++;
}
else if (dot[i] == '.') {
rhb[count1] = dot[i];
pair_2[count1] = i;
count1++;
}
else {
dots[count2] = dot[i];
pair_3[count2] = i;
count2++;
}
}
printf("Base-pair details :\n");
for (j = 0; j < count; j++)
printf("%d--%d\n", pair_1[j] + 1, pair_3[count - j - 1] + 1);
printf("Loop details :\n");
// for(j=0;j<=count;j++)
// printf("--%d-",pair_2[j]+1);
return 0;
}
最佳答案
我不确定您到底想要得到什么,但是这个perl生成的结果与Navidad20相同,它依赖于正则表达式它使用Regexp::Common模块来获取平衡圆括号的位置,并使用一个简单的while
循环来获取“free”元素的位置它从1开始计数,而不是从0开始。
我不知道它在处理无效数据时会如何表现。
#!/usr/bin/perl
use strict;
use warnings;
use Regexp::Common qw /balanced/;
my $seq = '(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....';
while ($seq =~ /(?=($RE{balanced}{-parens=>'()'}))/g) {
print 1 + $-[1], ' ', $+[1], " $1\n";
}
my @free;
push @free, [ 1 + $-[0] .. $+[0] ] while $seq =~ /\.+/g;
use Data::Dumper; print Dumper \@free;
输出为:
1 72 (((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))
2 71 ((((((..((((.....(..)))).((((.........)))).....(((((..)....)))))))))))
3 70 (((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))
4 69 ((((..((((.....(..)))).((((.........)))).....(((((..)....)))))))))
5 68 (((..((((.....(..)))).((((.........)))).....(((((..)....))))))))
6 67 ((..((((.....(..)))).((((.........)))).....(((((..)....)))))))
7 66 (..((((.....(..)))).((((.........)))).....(((((..)....))))))
10 65 ((((.....(..)))).((((.........)))).....(((((..)....)))))
11 25 (((.....(..))))
12 24 ((.....(..)))
13 23 (.....(..))
19 22 (..)
27 43 ((((.........))))
28 42 (((.........)))
29 41 ((.........))
30 40 (.........)
49 64 (((((..)....))))
50 63 ((((..)....)))
51 62 (((..)....))
52 61 ((..)....)
53 56 (..)
$VAR1 = [
[
8,
9
],
[
14,
15,
16,
17,
18
],
[
20,
21
],
[
26
],
[
31,
32,
33,
34,
35,
36,
37,
38,
39
],
[
44,
45,
46,
47,
48
],
[
54,
55
],
[
57,
58,
59,
60
],
[
73,
74,
75,
76
]
];
关于python - 找出给定结构中的RNA碱基配对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41066448/