Extraction texte sur plusieurs lignes en Perl

Résolu
Bonjour,

je souhaiterais pouvoir recuperer une partie du texte qui se trouve dans un fichier dont la structure est la suivante :

...
<td valign=top><b>TOPO_DOM</b></td>
<td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TOPO_DOM@24@247">24-247</a></b></td>
<td valign=top><b>224</b></td>
<td ><b>Extracellular (Potential)</b><br><tt>QFHGEKGISI PDHGFCQPIS IPLCTDIAYN QTIMPNLLGH TNQEDAGLEV HQFYPLVKVQ
CSPELRFFLC SMYAPVCTVL EQAIPPCRSI CERARQGCEA LMNKFGFQWP ERLRCEHFPR
HGAEQICVGQ NHSEDGAPAL LTTAPPPGLQ PGAGGTPGGP GGGGAPPRYA TLEHPFHCPR
VLKVPSYLSY KFLGERDCAA PCEPARPDGS MFFSQEETRF ARLW
</tt></td>
</tr>
<tr bgcolor="#FFFFCC">
<td valign=top><input type=checkbox name=seq value=">Q14332|TRANSMEM_248-268 1 (Potential)
ILTWSVLCCASTFFTVTTYLV"></td>
<td valign=top><b>TRANSMEM</b></td>
<td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TRANSMEM@248@268">248-268</a></b></td>
<td valign=top><b>21</b></td>
<td ><b>1 (Potential)</b><br><tt>ILTWSVLCCA STFFTVTTYL V </tt></td>
</tr>
<tr bgcolor="#FFFFCC">
<td valign=top><input type=checkbox name=seq value=">Q14332|TOPO_DOM_269-279 Cytoplasmic (Potential)
DMQRFRYPERP"></td>
<td valign=top><b>TOPO_DOM</b></td>
...

La partie qui m'interesse est la chaine de caractere en majuscule située près de l'expression "Extracellular (Potential)", et qui se termine juste avant la balise "</tt>". comme elle est sur plusieurs lignes, je ne sais pas trop comment faire.

Merci de votre aide !
Configuration: Windows XP
Internet Explorer 6.0

5 réponses

  1. Modérateur
    Salut,

    #!/usr/bin/perl
    use strict;use warnings;
    
    while(<DATA>){print if /Extracellular/ ... /<\/tt/}
    __END__
    <td valign=top><b>TOPO_DOM</b></td>
    <td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TOPO_DOM@24@247">24-247</a></b></td>
    <td valign=top><b>224</b></td>
    <td ><b>Extracellular (Potential)</b><br><tt>QFHGEKGISI PDHGFCQPIS IPLCTDIAYN QTIMPNLLGH TNQEDAGLEV HQFYPLVKVQ
    CSPELRFFLC SMYAPVCTVL EQAIPPCRSI CERARQGCEA LMNKFGFQWP ERLRCEHFPR
    HGAEQICVGQ NHSEDGAPAL LTTAPPPGLQ PGAGGTPGGP GGGGAPPRYA TLEHPFHCPR
    VLKVPSYLSY KFLGERDCAA PCEPARPDGS MFFSQEETRF ARLW </tt></td>
    </tr>
    <tr bgcolor="#FFFFCC">
    <td valign=top><input type=checkbox name=seq value=">Q14332|TRANSMEM_248-268 1 (Potential)
    ILTWSVLCCASTFFTVTTYLV"></td>
    <td valign=top><b>TRANSMEM</b></td>
    <td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TRANSMEM@248@268">248-268</a></b></td>
    <td valign=top><b>21</b></td>
    <td ><b>1 (Potential)</b><br><tt>ILTWSVLCCA STFFTVTTYL V </tt></td>
    </tr>
    <tr bgcolor="#FFFFCC">
    <td valign=top><input type=checkbox name=seq value=">Q14332|TOPO_DOM_269-279 Cytoplasmic (Potential)
    DMQRFRYPERP"></td>
    <td valign=top><b>TOPO_DOM</b></td>
    On obtiens
    root@debian:~# perl ccm.pl
    <td ><b>Extracellular (Potential)</b><br><tt>QFHGEKGISI PDHGFCQPIS IPLCTDIAYN QTIMPNLLGH TNQEDAGLEV HQFYPLVKVQ
    CSPELRFFLC SMYAPVCTVL EQAIPPCRSI CERARQGCEA LMNKFGFQWP ERLRCEHFPR
    HGAEQICVGQ NHSEDGAPAL LTTAPPPGLQ PGAGGTPGGP GGGGAPPRYA TLEHPFHCPR
    VLKVPSYLSY KFLGERDCAA PCEPARPDGS MFFSQEETRF ARLW </tt></td>
    
    Il te reste à supprimer les balises de début est fin.
    Je n'ai pas le temps d'entrer dans les détails, je suis au boulot ;-)
    0
    1. Modérateur
      Tiens une autre version

      #!/usr/bin/perl
      use strict;use warnings;
      
      my @tab;
      while(<DATA>){push @tab,$_ if /Extracellular/ ... /<\/tt/}
      grep { s/<.*?\/?>//g } @tab;
      print "@tab\n";
      __END__
      <td valign=top><b>TOPO_DOM</b></td>
      <td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TOPO_DOM@24@247">24-247</a></b></td>
      <td valign=top><b>224</b></td>
      <td ><b>Extracellular (Potential)</b><br><tt>QFHGEKGISI PDHGFCQPIS IPLCTDIAYN QTIMPNLLGH TNQEDAGLEV HQFYPLVKVQ
      CSPELRFFLC SMYAPVCTVL EQAIPPCRSI CERARQGCEA LMNKFGFQWP ERLRCEHFPR
      HGAEQICVGQ NHSEDGAPAL LTTAPPPGLQ PGAGGTPGGP GGGGAPPRYA TLEHPFHCPR
      VLKVPSYLSY KFLGERDCAA PCEPARPDGS MFFSQEETRF ARLW </tt></td>
      </tr>
      <tr bgcolor="#FFFFCC">
      <td valign=top><input type=checkbox name=seq value=">Q14332|TRANSMEM_248-268 1 (Potential)
      ILTWSVLCCASTFFTVTTYLV"></td>
      <td valign=top><b>TRANSMEM</b></td>
      <td valign=top nowrap><b><a href="/cgi-bin/sprot-ft-details.pl?Q14332@TRANSMEM@248@268">248-268</a></b></td>
      <td valign=top><b>21</b></td>
      <td ><b>1 (Potential)</b><br><tt>ILTWSVLCCA STFFTVTTYL V </tt></td>
      </tr>
      <tr bgcolor="#FFFFCC">
      <td valign=top><input type=checkbox name=seq value=">Q14332|TOPO_DOM_269-279 Cytoplasmic (Potential)
      DMQRFRYPERP"></td>
      <td valign=top><b>TOPO_DOM</b></td>
      
      Le résultat
      root@debian:~# perl ccm.pl
      Extracellular (Potential)QFHGEKGISI PDHGFCQPIS IPLCTDIAYN QTIMPNLLGH TNQEDAGLEV HQFYPLVKVQ
       CSPELRFFLC SMYAPVCTVL EQAIPPCRSI CERARQGCEA LMNKFGFQWP ERLRCEHFPR
       HGAEQICVGQ NHSEDGAPAL LTTAPPPGLQ PGAGGTPGGP GGGGAPPRYA TLEHPFHCPR
       VLKVPSYLSY KFLGERDCAA PCEPARPDGS MFFSQEETRF ARLW
      
      0
      1. Super je devrai arriver à me debrouiller avec ça.
        Merci bcp lami20j !
        je mettrai le sujet en résolu quand j'aurai fini de traiter mes fichiers.
        0
        1. Donc le code qui ma permis de resoudre mon probleme est

          my @tab;
          while(<DATA>){push @tab,$_ if /Extracellular/ ... /<\/tt/}
          grep { s/<.*?\/?>//g } @tab;
          print "@tab\n";

          Encore merci lami20j
          0
          1. bonjour a tous,

            j'ai un problème similaire a notre ami gingerbrice:

            voici mon texte :

            ID Q8VLP7_STRAG Unreviewed; 544 AA.
            AC Q8VLP7;
            DT 01-MAR-2002, integrated into UniProtKB/TrEMBL.
            DT 01-MAR-2002, sequence version 1.
            DT 09-FEB-2010, entry version 23.
            DE SubName: Full=Group B streptococcus secreted protein;
            DE Flags: Precursor;
            GN Name=bsp;
            OS Streptococcus agalactiae sophisticae ultrae compilatum (message entre
            OS parentheses).
            OC Bacteria; Firmicutes; Lactobacillales; Streptococcaceae;
            OC Streptococcus.
            OX NCBI_TaxID=1311;
            la partie en gras est le texte qui m'interresse. J'aimerais bien utiliser uniquement les regex afin de pouvoir extraire cette partie de texte. Tout en sachant qu'il me faut que les informations des lignes commençant par le même "identifiant".

            J'ai pondu ceci : (.?OS (.*)\n?)+\.

            mais ça ne me permet pas d'avoir que le texte sans les à coté.

            Pouvez-vous m'aider ?
            0