Как я могу извлечь Paragaphs и выделенные строки с Perl? - PullRequest
3 голосов
/ 14 апреля 2010

У меня есть текст, где мне нужно:

  1. чтобы извлечь весь абзац под в разделе «Сводка Aceview» до строки, которая начинается с «Пожалуйста, указывайте» (не включается).
  2. чтобы извлечь строку, начинающуюся с "Ближайшего человеческого гена".
  3. чтобы сохранить их в массиве с двумя элементами.

Текст выглядит так ( также на pastebin ):

  AceView: gene:1700049G17Rik, a comprehensive annotation of human, mouse and worm genes with mRNAs or ESTsAceView.

  <META NAME="title"
 CONTENT="
AceView: gene:1700049G17Rik a comprehensive annotation of human, mouse and worm genes with mRNAs or EST">

<META NAME="keywords"
 CONTENT="
AceView, genes, Acembly, AceDB, Homo sapiens, Human,
 nematode, Worm, Caenorhabditis elegans , WormGenes, WormBase, mouse,
 mammal, Arabidopsis, gene, alternative splicing variant, structure,
 sequence, DNA, EST, mRNA, cDNA clone, transcript, transcription, genome,
 transcriptome, proteome, peptide, GenBank accession, dbest, RefSeq,
 LocusLink, non-coding, coding, exon, intron, boundary, exon-intron
 junction, donor, acceptor, 3'UTR, 5'UTR, uORF, poly A, poly-A site,
 molecular function, protein annotation, isoform, gene family, Pfam,
 motif ,Blast, Psort, GO, taxonomy, homolog, cellular compartment,
 disease, illness, phenotype, RNA interference, RNAi, knock out mutant
 expression, regulation, protein interaction, genetic, map, antisense,
 trans-splicing, operon, chromosome, domain, selenocysteine, Start, Met,
 Stop, U12, RNA editing, bibliography">
<META NAME="Description" 
 CONTENT= "
AceView offers a comprehensive annotation of human, mouse and nematode genes
 reconstructed by co-alignment and clustering of all publicly available
 mRNAs and ESTs on the genome sequence. Our goals are to offer a reliable
 up-to-date resource on the genes, their functions, alternative variants,
 expression, regulation and interactions, in the hope to stimulate
 further validating experiments at the bench
">


<meta name="author"
 content="Danielle Thierry-Mieg and Jean Thierry-Mieg,
 NCBI/NLM/NIH, mieg@ncbi.nlm.nih.gov">




   <!--
    var myurl="av.cgi?db=mouse" ;
    var db="mouse" ;
    var doSwf="s" ;
    var classe="gene" ;
  //-->

Однако я застрял в следующей логике сценария. Как правильно достичь этого?

   #!/usr/bin/perl -w

   my  $INFILE_file_name = $file;      # input file name

    open ( INFILE, '<', $INFILE_file_name )
        or croak "$0 : failed to open input file $INFILE_file_name : $!\n";


    my @allsum;

    while ( <INFILE> ) {
        chomp;

        my $line = $_;

        my @temp1 = ();
        if ( $line =~ /^ AceView summary/ ) {
            print "$line\n";
            push @temp1, $line;
        }
        elsif( $line =~ /Please quote/) {
            push @allsum, [@temp1];
             @temp1 = ();
        }
        elsif ($line =~ /The closest human gene/) {

            push @allsum, $line;
        }

    }

    close ( INFILE );           # close input file
    # Do something with @allsum

Есть много таких файлов, которые мне нужно обработать.

Ответы [ 3 ]

5 голосов
/ 14 апреля 2010

Вы можете использовать оператор диапазона в скалярном контексте, чтобы извлечь весь абзац:

while (<INFILE>) {
    chomp;
    if (/AceView summary/ .. /Please quote/) {
        print "$_\n";
    }

    print "$_\n" if /^The closest human gene/;
}
4 голосов
/ 14 апреля 2010

Если я правильно понимаю, вы получите эту информацию от http://www.ncbi.nlm.nih.gov/IEB/Research/Acembly/av.cgi?db=mouse&c=gene&a=fiche&l=1700049G17Rik, которая возвращает одну из самых ужасных мешанины HTML, которую я когда-либо видел (возможно, в первую очередь, связан с выкидышами в поиске плана Medicare). *

Однако для HTML :: TokeParser :: Simple :

он все еще не соответствует
#!/usr/bin/perl

use strict; use warnings;
use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new('ace.html');
my ($summary, $closest_human);

while ( my $tag = $parser->get_tag('span') ) {
    next unless $tag->get_attr('class') eq 'hh3';
    next unless $parser->get_text('/span') eq 'AceView summary';
    $summary = $parser->get_text('span');
    $summary =~ s/^\s+//;
    $summary =~ s/\s*Please quote:.*\z//;
    last;
}

while ( my $tag = $parser->get_tag('b') ) {
    $closest_human = $parser->get_text('/b');
    next unless $closest_human eq 'The closest human genes';
    $closest_human .= $parser->get_text('br');
    last;
}

print "=== Summary ===\n\n$summary\n\n";
print "=== Closest Human Gene ==\n\n$closest_human\n"

Вывод (разрезанный):

=== Summary ===

Note that this locus is complex: it appears to produce several proteins with no
sequence overlap.
Expression: According to AceView, this gene is well expressed, 
... 
Please see the Jackson Laboratory Mouse Genome Database/Informatics site MGI_192
0680 for in depth functional annotation of this gene.

=== Closest Human Gene ==

The closest human genes, according to BlastP, are the AceView genes ZNF780AandZN
F780B (e=10^-15,), ZNF766 (e=2 10^-15,), ZNF607andZNF781andZFP30 (e=2 10^-14,).
1 голос
/ 14 апреля 2010

OTTOMH Я бы сделал часть извлечения с помощью простого конечного автомата. Начните с состояния = 0, установите его на единицу, когда /AceView summary/, и на ноль на /Please quote/. Затем нажмите $_ в свой выходной массив, если $ state == 1.

Но мне больше нравится ответ Евгения. Это Perl, есть много способов снять шкуру со своей пресловутой кошкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...