是否可以使用正则表达式在字符串中搜索碱基对?

时间:2017-05-02 21:17:20

标签: regex perl bioinformatics

我试图使用正则表达式在字符串中的位置查找RNA碱基对(即AU,CG,GC,UA,GU,UG)。我正在选择一个Perl程序,该程序将在某些位置提取字符,并使用我提供的正则表达式查找匹配项。例如,给定字符串AUGCCGU,我可以提取第一个和最后一个字符AU,然后检查它们是否与我提供的正则表达式匹配。 旁注:我只能提供一个正则表达式而不能提供其他代码。

提取2个字符后测试单个碱基对非常简单:(AU)|(CG)|(U[AG])|(G[CU])UA = matchUC = no match等等。然而,我想知道是否有合理的方法来测试4个(或更多)字符并寻找1个(或更多)碱基对匹配:换句话说:给定4个提取的字符,查找字符1& 4和2& 3之间的对,并在找到1对或更多对时报告匹配: ACGU = match(2对 - AU,CG),ACCU = match(1对,AU),ACUC = no match(0对)。

任何建议将不胜感激。我觉得可能需要背面参考和条件的组合,但我真的不知道如何在这里弄清楚如何应用它们。或者这甚至可能吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试在给定一组模式和位置​​的情况下生成正则表达式。例如:

use strict;
use warnings;
use Regexp::Assemble;

my @patterns = qw( AU CG UA UG GC GU );
my @match_pos = qw( 14 23 );
my $pat_size = 4;
my $regex = build_regex( \@patterns, \@match_pos, $pat_size );

sub build_regex {
    my ( $patterns, $match_pos, $size ) = @_;
    my $ra = Regexp::Assemble->new();

    for my $pos_str ( @$match_pos ) {
        my @pos = map { $_ - 1 } split //, $pos_str;
        for my $pat_short ( @$patterns ) {
            my @pat = ('.') x $pat_size;
            my @chars = split //, $pat_short;
            @pat[@pos] = @chars;
            my $pat = join '', @pat;
            $ra->add($pat);
        }
    }
    my $regex = $ra->re;
    return $regex;
}

此正则表达式将匹配位置1和4或位置2或3处的所有模式。

答案 1 :(得分:0)

您似乎只想获得两列,看看它们是否符合您的要求 正则表达对。

没有必要尝试在单个正则表达式中完成所有操作。

这是更快的方法。使用substr()来制作目标,然后使用 用正则表达式测试它。

将所有输入和输出保持在一个结构中 在下面的示例中,这是 Que 哈希。

它不一定非常复杂。

Perl代码

use strict;
use warnings;


my $FullSequence = 'AUGCCGU';

my %Que = (

 # structure:
 #  item =   col pair  ,  results ( target , match )
    '1' => [  1,    7,     '', '' ],
    '2' => [  2,    1,     '', '' ],
    '3' => [  2,    3,     '', '' ],
    '4' => [  5,    3,     '', '' ],
    '5' => [  5,    2,     '', '' ],
    '6' => [  2,    3,     '', '' ],

      # simple overlap test
    '7a' => [ 1,    2,     '', '' ],
    '7b' => [ 2,    3,     '', '' ],
    '7c' => [ 3,    4,     '', '' ],
    '7d' => [ 4,    5,     '', '' ],
    '7e' => [ 5,    6,     '', '' ],
    '7f' => [ 6,    7,     '', '' ],
);

# Process Que
  for my $key (keys %Que )
  {
     # Get target pair at column locations
      my $target = substr( $FullSequence, $Que{$key}->[0] - 1, 1 ) . substr( $FullSequence, $Que{$key}->[1] - 1, 1 );
      $Que{$key}->[2] = $target; 

     # Get match result of target
      if ( $target =~ /(AU|CG|U[AG]|G[CU])/ ) {
          $Que{$key}->[3] = $1;
          next;
      }
      $Que{$key}->[3] = 'no match';
  }

# Print Que result
  for my $key ( sort (keys %Que) )
  {
      print "item $key = ";
      print "cols (" . $Que{$key}->[0] . "," . $Que{$key}->[1] . ") ";
      print "result (" . $Que{$key}->[2]. ")  = " . $Que{$key}->[3] . "\n";

  }

输出

item 1 = cols (1,7) result (AU)  = AU
item 2 = cols (2,1) result (UA)  = UA
item 3 = cols (2,3) result (UG)  = UG
item 4 = cols (5,3) result (CG)  = CG
item 5 = cols (5,2) result (CU)  = no match
item 6 = cols (2,3) result (UG)  = UG
item 7a = cols (1,2) result (AU)  = AU
item 7b = cols (2,3) result (UG)  = UG
item 7c = cols (3,4) result (GC)  = GC
item 7d = cols (4,5) result (CC)  = no match
item 7e = cols (5,6) result (CG)  = CG
item 7f = cols (6,7) result (GU)  = GU