Problema pattern per Espressioni Regolari

di il
9 risposte

Problema pattern per Espressioni Regolari

Salve, mi sto approcciando allo studio delle espressioni regolari per python.
Ho sempre usato finora dei pattern specifici in questa notazione,per esempio:

pattern = "[aeiou][a-z]*[aeiou]"
ora mi viene presentata questa notazione, per esempio:

pattern = r"([aeiou]).*\1"
Prima di capire il significato del secondo pattern mi piacerebbe sapere perchè pattern ora è una stringa raw?

9 Risposte

  • Re: Problema pattern per Espressioni Regolari

    Perché altrimenti Python espande i '\'...
  • Re: Problema pattern per Espressioni Regolari

    Andrea Quaglia ha scritto:


    Perché altrimenti Python espande i '\'...
    Quindi uso la stringa raw cosi che python non interpreta i caratteri preceduti da "\" come sequenze di escape?
    
    pattern = r"([aeiou]).*\1"
     
    Perche vengono messe parentesi intorno [aeiou]?
  • Re: Problema pattern per Espressioni Regolari

    Esatto.
  • Re: Problema pattern per Espressioni Regolari

    MasterBit ha scritto:


    Perche vengono messe parentesi intorno [aeiou]?
    Le parentesi indicano il raggruppamento dell’occorrenza, in questo caso di tipo inclusivo, che vuoi intercettare nella stringa.

    \1 indica il riferimento al primo raggruppamento.
  • Re: Problema pattern per Espressioni Regolari

    Grazie Fix mi è stato molto di aiuto. Ora mi è stato proposto un esercizio, quello di valutare se un codice fiscale sia corretto o meno all'intero di un testo.
    Tralasciando tutto il codice mi vorrei concentrare su un punto che non capisco. Ho scritto questo pattern ma mi da sempre errore.
    
    pattern = r"[A-Z]{3}\b?[A-Z]{3}\b?[0-9]{2}([A-Z])([0-9]{2})\b?[A-Z][0-9]{3}[A-Z]"
    
    Perchè? O meglio con "\b" non vado ad intercettare i caratteri di spaziatura? se sostituisco però "\b" con " " il pattern funziona. Non riesco a capirne il motivo, questo è quello che funziona:
    
    pattern = r"[A-Z]{3} ?[A-Z]{3} ?[0-9]{2}([A-Z])([0-9]{2}) ?[A-Z][0-9]{3}[A-Z]"
    
  • Re: Problema pattern per Espressioni Regolari

    Il metacarattere \b è sbagliato in questa circostanza, è un' àncora che identifica un limite detto di "parola" (più correttamente alfanumerico), si aspetta quindi di trovarsi tra un carattere alfanumerico ed uno che non lo è (come lo spazio)

    E' come $, ^, etc..

    Lo spazio lo puoi ricercare con \s? ma non capisco perchè dovresti valutarlo visto che il CF non ne ha.

    PS: a questo link trovi le informazioni su come viene codificato il codice fiscale:
    https://www.agenziaentrate.gov.it/portale/web/guest/schede/istanze/richiesta-ts_cf/informazioni-codificazione-pf
  • Re: Problema pattern per Espressioni Regolari

    Fix ha scritto:


    Il metacarattere \b è sbagliato in questa circostanza, è un' àncora che identifica un limite detto di "parola" (più correttamente alfanumerico), si aspetta quindi di trovarsi tra un carattere alfanumerico ed uno che non lo è (come lo spazio)

    E' come $, ^, etc..

    Lo spazio lo puoi ricercare con \s? ma non capisco perchè dovresti valutarlo visto che il CF non ne ha.

    PS: a questo link trovi le informazioni su come viene codificato il codice fiscale:
    https://www.agenziaentrate.gov.it/portale/web/guest/schede/istanze/richiesta-ts_cf/informazioni-codificazione-pf
    Ok con "\s" funziona.
    No infatti il codice fiscale non dovrebbe avere spazi anche se mi viene chiesto di valutare il caso in cui tra i primi 3 caratteri e i secondi 3 caratteri ci sia uno spazio opzionale.

    Perchè in questo caso non funziona"\b"? E in questo si?
    
    pattern = r"\b([a-z0-9])[a-z0-9]*\b[^a-z]\b(\1)[a-z0-9]*\b"
    
    Questo pattern cerca due parole consecutive che iniziano con lo stesso carattere.
  • Re: Problema pattern per Espressioni Regolari

    La seconda espressione funziona perchè si concretizza il match del pattern "incluso tra i punti di ancoraggio".

    \b, come scritto precedentemente, è un'àncora, quindi devi intenderla come una posizione, non come una classe di caratteri.

    Per convalidare la posizione di \b, è necessario che \b sia contenuto tra un carattere alfanumerico ed uno NON alfanumerico.

    Per cui "\b......\b" identifica una PAROLA solo quando sia a sinistra del primo \b, che a destra del secondo \b, ci sono caratteri NON alfanumerici
  • Re: Problema pattern per Espressioni Regolari

    Fix ha scritto:


    La seconda espressione funziona perchè si concretizza il match del pattern "incluso tra i punti di ancoraggio".

    \b, come scritto precedentemente, è un'àncora, quindi devi intenderla come una posizione, non come una classe di caratteri.

    Per convalidare la posizione di \b, è necessario che \b sia contenuto tra un carattere alfanumerico ed uno NON alfanumerico.

    Per cui "\b......\b" identifica una PAROLA solo quando sia a sinistra del primo \b, che a destra del secondo \b, ci sono caratteri NON alfanumerici
    Perfetto ora ho capito grazie mille.
Devi accedere o registrarti per scrivere nel forum
9 risposte