Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Perl e RE

  1. #1

    Perl e RE

    Ciao a tutti!

    Aiutino per un'imbranata per favore!!!!

    Dunque, io dovrei scrivere un programmino in Perl+RE del tipo:

    while(<>){
    s/[ab]/c/g;
    s/.../;;;/g;
    }

    che mi permetta in una lista di "cose" fatte così:

    |01
    [ [ CC: N_C] [ AGR: @FS] [ POTGOV: PARTE#S@FS]]
    PARTE PARTIRE#V@S3IP PARTE#S@FS+

    di eliminare tutto e lasciare solo la "parte" della "cosa" che ha accanto il simbolo + (in questo caso ad esempio: PARTE#S@FS+)

    Credo sia una cosa facile, ma io non so dove mettere le mani.....

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    La cosa e` facile, ma non ho capito cosa vuoi esattamente.
    In particolare devi dire:
    - quale e ` il carattere (o la stringa) che "separa" i vari pezzi.
    - se i vari pezzi possono essere spezzati da un acapo
    - che significato hanno le parentesiquadre nelle stringhe
    - cosa deve apparire al posto dei pezzi sostituiti (in pratica cosa succede se in una riga non ci sono pezzi che ti interessano).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Guarda, praticamente io ho un testo che ho tokenizzato e analizzato con un programma che praticamente per ogni parola mi da una cosa come questa:

    |01
    [ [ CC: N_C] [ AGR: @FS] [ POTGOV: PARTE#S@FS]]
    parte PARTIRE#V@S3IP PARTE#S@FS+

    e quella col + sarebbe la PartOfSpeech corretta (nell'esempio ha riconosciuto che PARTE è un sostantivo femminile singolare e non un verbo, ad esempio)

    Ecco io praticamente devo riottenere una lista con le parole del testo che abbiano accanto solamente la PartOfSpeech giusta, e cioè quella col +, tutto il resto lo devo eliminare.

    Metto un esempio un pò più lungo magari si capisce meglio... Da questo:

    |02
    [ [ CC: FV_C] [ CLIT: CI#PQ@FP1@MP1] [ AGR: @S3] [ POTGOV: ESSERE#V@S3II]]
    C' CI#B CI#PQ@FP1@MP1 C'#SP@NN
    era ESSERE#V@S3II+ ERA#S@FS

    |02
    [ [ CC: N_C] [ DET: UNA#RI@FS] [ AGR: @FS] [ POTGOV: VOLTA#S@FS]]
    una UNA#N@FS UNA#P@FS UNA#RI@FS+ UNA#S@FP@FS
    volta VOLGERE#V@FSPR VOLTARE#V@S2MP@S3IP VOLTA#S@FS+

    |02
    [ [ CC: N_C] [ DET: UN#RI@MS] [ AGR: @MS] [ POTGOV: PRINCIPE#S@MS]]
    un UN#N@MS UN#P@MS UN#RI@MS+
    principe PRINCIPE#A@FS@MS PRINCIPE#S@MS+

    |01
    [ [ CC: CHE_C] [ POTGOV: CHE#che]]
    |02
    [ [ CC: FV_C] [ AGR: @S3] [ MOD: VOLERE#V@S3II] [ POTGOV: AVERE#V@F]]
    che CHE#che@#+
    voleva VOLERE#V@S3II+
    avere AVERE#S@MS AVERE#V@F+

    Io devo ottenere:

    C'
    era ESSERE#V@S3II+
    una UNA#RI@FS+
    volta VOLTA#S@FS+
    un UN#RI@MS+
    principe PRINCIPE#S@MS+

    e via così...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Quando si vogliono fare cose di questo tipo, occorre dare al computer una REGOLA che sia universale.
    Non importa quanto complessa sia la regola, ma occorre che non abbia eccezioni (pero` se la regola e` semplice e` piu` facile implementarla).

    Nel tuo pezzo io vedo:
    righe che vanno eliminate
    righe da cui occorre estrarre due pezzi (supponendo che i pezzi siano separati da spazi)
    righe da cui estrarre un pezzo.
    Pero` da questo io non riesco a dedurre LA regola.
    Riesco ad individuare alcune regolette (cioe` pezzi della REGOLA), ma non sono sicuro che siano universali, ne` che siano complete:
    - Tutte le righe che iniziano per | (barraverticale) sono da eliminare?
    - Tutte le righe che iniziano (o contengono) la quadra sono da eliminare?
    - Delle altre righe si prende il primo pezzo?
    - Delle altre righe si prende il pezzo che termina con il +?

    Di solito chi ci lavora riesce a saperne di piu`, dato che ha una conoscenza del contesto e/o del processo che porta a quelle stringhe (che io chiaramente non ho).

    Nota che ho parlato di righe, cioe` la RE (o successione di RE) deve analizzare le righe una alla volta. Potrebbe non essere cosi` (sempre in base alle considerazioni di cui sopra).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Originariamente inviato da Mich_
    - Tutte le righe che iniziano per | (barraverticale) sono da eliminare?
    - Tutte le righe che iniziano (o contengono) la quadra sono da eliminare?
    - Delle altre righe si prende il primo pezzo?
    - Delle altre righe si prende il pezzo che termina con il +?
    Si praticamente è così, devo:

    -Togliere tutte le righe che iniziano per |
    -Togliere tutte le righe che iniziano e finiscono con la quadra
    -Dalle altre righe prendere la prima parola e SOLO la parte che termina con il +

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Allora a questo punto io farei una copia delle parti che ti interessano da un file ad un altro.
    Magari c'e` un metodo piu` semplice/intelligente, ma non so se sarei in grado di trovarlo (non sono un grande esperto di Perl ne` di RE, ma un po' le ho usate):
    codice:
    open (FI, "<file_input");    #apertura file input
        || die "Non posso aprire file ...\n";
    open (FO, ">file_out");
    while ( <FI> ) {                 # legge la riga
      loop if ( /^[\[\|]/ );               # riga inizia per [ o |
      /^([^ ]+?) ([^ ]+?\+)/g;       #estrae prima parola e parola che termina per +
      print $1 $2;
    }
    al posto degli spazi puoi sostituire \s (carattere blank)

    Ho alcuni dubbi:
    1. se occorre usare il loop per passare al loop successivo 9sto facendo confusione con altri linguaggi)
    2. che succede se non c'e` il $2.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Ho provato ad eseguirlo ed ecco il risultato:

    non posso aprire file ...

    Ho provato a modificarlo in 1000 modi ma non va

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Quello era un esempio schematico. Devi adattarlo.

    Come aprire il file dipende da come e` fatto il file e dal path.
    E` chiaro che se non funziona l'open il resto del codice non lo puoi provare.

    Ma se hai problemi a programmare in Perl (se non conosci le funzioni proposte), e` un problema diverso da quanto hai chiesto (che riguarda la RE di selezione di una stringa).

    Io ho dato per scontato che avessi i dati in un file e che fossi in grado di aprire un file.
    In caso contrario devi leggerti un tutorial con esempi, e seguirlo passo-passo: Mi ricordo che a suo tempo ho seguito il tutorial presente in HTML.it
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Si si ma ho sostituito diciamo le parti schematiche con i valori necessari, insomma l'ho adattato ai miei dati... Solo che mi da sempre un qualche errore.

    Continuerò a provare finchè non trovo la soluzione giusta!

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ma l'istruzione die viene eseguita se quella cui e` collegata non e` andata a buon fine.
    Significa che non e` riuscito ad aprire il file.

    Non posso conoscere il motivo per cui non ha aperto il file: forse lo puoi trovare nel log degli errori, se puoi accedere a quel file.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.