diff --git a/laboratorio/lab6-11ott24/esercizi-regexp.ipynb b/laboratorio/lab6-11ott24/esercizi-regexp.ipynb new file mode 100644 index 0000000..7020f5f --- /dev/null +++ b/laboratorio/lab6-11ott24/esercizi-regexp.ipynb @@ -0,0 +1,1268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python - Espressioni regolari" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Regular Expression, RE**: stringa che rappresenta un insieme di stringhe (cioè un linguaggio).\n", + "\n", + "Le espressioni regolari fanno parte del modulo `re`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operazioni con le RE\n", + "\n", + "---\n", + "\n", + "### La funzione `search()`\n", + "\n", + " search(re_expr, string)\n", + "\n", + "restituisce un oggetto (classe `Match`) che:\n", + "- contiene il risultato dell'operazione di confronto, se `string` contiene come sottostringa (anche non propria) una delle stringhe rappresentate da `re_expr`\n", + "- restituisce un oggetto di tipo `NoneType` in caso contrario\n", + "\n", + "`re_expr` può essere:\n", + "- la stringa che rappresenta l'espressione regolare\n", + "- l'oggetto restituito dalla funzione `compile()`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Esempi con quantificatore `+`**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**NB**: l'operazione cattura solo la *leftmost occurrence*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbcccabbbbbbbbbbbbcccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**NB**: il comportamento è *greedy*." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Esempi con quantificatore `*`**" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccaccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Esempi con quantificatore `?`**" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccaccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Altri quantificatori" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Esattamente n: `{n}`**" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbbbbbbbbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Almeno m e non più di n: `{m,n}`**" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbbbbbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Almeno m: `{m,}`**" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbbbbbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Non più di n: `{,n}`**" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stringa = 'cccccabbbbbbbbbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**RIASSUMENDO...:**\n", + "- `+`: quantificatore per 1 o più occorrenze del simbolo precedente\n", + "- `*`: quantificatore per 0 o più occorrenze del simbolo precedente\n", + "- `?`: quantificatore per 0 o 1 occorrenza del simbolo precedente\n", + "\n", + "Inoltre:\n", + "\n", + "- `{m,n}`: da `m` a `n` occorrenze\n", + " `{0,1}` equivale a `?`\n", + "- `{m,}`: almeno `m` occorrenze \n", + " `{1,}` equivale a `+`\n", + " `{0,}` equivale a `*`\n", + "- `{,n}`: al più `n` occorrenze \n", + "- `{m}`: esattamente `m` occorrenze " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### La funzione `match()`\n", + "\n", + " match(re_expr, string)\n", + "\n", + "restituisce un oggetto (classe `Match`) che:\n", + "- contiene il risultato dell'operazione di confronto se `string` contiene come prefisso (anche non proprio) una delle stringhe rappresentate da `re_expr`\n", + "- restituisce un oggetto di tipo `NoneType` in caso contrario" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### La funzione `findall()`\n", + "\n", + "\n", + " findall(re_expr, string)\n", + "\n", + "restituisce la lista di tutte le occorrenze, nella stringa `string`, non sovrapposte di stringhe rappresentate da `re_expr`." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'xxxabbbbabbxxxabbbabbbbbbbb'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### La funzione `finditer()`\n", + "\n", + "\n", + " finditer(re_expr, string)\n", + "\n", + "restituisce la lista degli oggetti di tipo `Match` relativi a tutte le occorrenze, nella stringa `string`, non sovrapposte di stringhe rappresentate da `re_expr`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'xxxabbbbabbxxxabbbabbbbbbbb'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### La funzione `sub()`\n", + "\n", + " sub(re_expr, r_string, string)\n", + " \n", + "restituisce la stringa ottenuta sostituendo in `string` tutte le occorrenze non sovrapposte di `re_expr` con la stringa `r_string`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'xxxabbbbabbxxxabbbabbbbbbbb'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come accedere alle informazioni contenute in un oggetto `Match`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- `start()` restituisce la posizione di inizio della sottostringa catturata dall'operazione\n", + "- `end()` restituisce la posizione successiva alla fine della sottostringa catturata dall'operazione\n", + "- `span()` restituisce la tupla contenente start ed end dell'occorrenza catturata" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cccccabbbbbccccccccccc'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come \"ancorare\" le occorrenze di una RE" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ancora di inizio riga `^`**" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = 'XXbatXXX\\nYYYbatYY\\nbatZZZZZ'\n", + "print(stringa1)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = 'XXbatXXX\\nYYYYYbat\\nZZZZZbat'\n", + "print(stringa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturiamo nelle due stringhe l'occorrenza di `bat` vincolata ad essere all'inizio di una riga nella stringa, aggiungendo il flag `re.M` che forza a interpretare `stringa` su più righe." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ancora di inizio stringa `\\A`**" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = 'XXbatXXX\\nYYYbatYY\\nbatZZZZZ'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "stringa3 = 'batXXX\\nYYYbatYY\\nbatZZZZZ'\n", + "print(stringa3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ancora di fine riga `$`**" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = 'XXbatXXX\\nYYYbatYY\\nbatZZZZZ'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = 'XXbatXXX\\nYYYYYbat\\nZZZZZbat'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ancora di fine stringa `\\Z`**" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = 'XXbatXXX\\nYYYYYbat\\nZZZZZbat'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ancora di confine di parola `\\b`**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **parola**: sequenza di lettere maiuscole o minuscole, cifre da 0 a 9 e simbolo `_`\n", + "- **confine di parola**: elemento di dimensione nulla tra un simbolo di parola e un \"non simbolo\" di parola" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'This cat is a cat'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturiamo l'occorrenza della parola `is`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'is this a cat?'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturiamo ora la sottostringa `is` intesa come suffisso di `this`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**RIASSUMENDO...**\n", + "- `^`: metasimbolo che rappresenta l'inizio di riga\n", + "- `$`: metasimbolo che rappresenta la fine di riga\n", + "- `\\A`: metasimbolo che rappresenta l'inizio di stringa\n", + "- `\\Z`: metasimbolo che rappresenta la fine di stringa\n", + "- `\\b`: confine di parola\n", + "- `\\B`: negazione del confine di parola\n", + "\n", + "prendono il nome di **ancore**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come specificare una classe di simboli" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'ZZZcaababbabbaabbbZZZZZ'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare la sottostringa `cabbabbabbaabbb`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = '*****0145414441658****'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare la sottostringa `0145414441658` composta di soli simboli di cifra." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = '*****AbcdRTUhgTTd****'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare la sottostringa `AbcdRTUhgTTd` composta di sole lettere minuscole e maiuscole." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = '*****Ab0_cd1R8_75T_UhgTTd****'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare la sottostringa `Ab0_cd1R8_75T_UhgTTd` composta di soli simboli di parola (lettere minuscole e maiuscole, simboli di cifra e underscore)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Hello world***'\n", + "print(stringa1)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = '***Ciao mondo***'\n", + "print(stringa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare `Hello world` da `stringa1` e `Ciao mondo` da `stringa2`, utilizzando la stessa RE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Hello world***'\n", + "print(stringa1)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = '***Ciao\\t\\tmondo***'\n", + "print(stringa2)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Ciao\\nmondo***'\n", + "print(stringa1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stringa2 = '***Ciao mondo***'\n", + "print(stringa2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Ciao\\t\\tmondo*011**AavR**'\n", + "print(stringa1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturiamo l'intera stringa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = '***Ciao\\t\\tmondo\\n*011**AavR**'\n", + "print(stringa2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**RIASSUMENDO...**\n", + "\n", + "Una classe di caratteri viene rappresentata da:\n", + "\n", + " [characters]\n", + " \n", + "cioè elencando i caratteri della classe in parentesi quadre.\n", + "\n", + "**Scorciatoie per alcune classi frequentemente utilizzate**:\n", + "\n", + "- `[0-9]`: qualsiasi cifra da 0 a 9 --> `\\d`\n", + "- `[^0-9]`: tutto ciò che non è cifra da 0 a 9 --> `\\D`\n", + "- `[a-zA-Z0-9_]`: qualsiasi simbolo di parola --> `\\w`\n", + "- `[^a-zA-Z0-9_]`: tutto ciò che non è simbolo di parola --> `\\W`\n", + "- `[␣\\t\\r\\n\\f]`: qualsiasi simbolo di spazio --> `\\s`\n", + "- `[^␣\\t\\r\\n\\f]`: tutto ciò che non è simbolo di spazio --> `\\S`\n", + "- `[^\\n]`: qualsiasi simbolo tranne `\\n` --> `.`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come specificare un raggruppamento" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'ZZZcaababbabbaabbbZZZZZcabababababZZZZZ'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare la sottostringa `cababababab` che è composta da una `c` seguita da un qualsivoglia numero di blocchi `ab`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come specificare un'alternativa" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Gatto***'\n", + "stringa2 = '***Topo***'\n", + "stringa3 = '***Ratto***'\n", + "\n", + "print(stringa1)\n", + "print(stringa2)\n", + "print(stringa3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Riconoscere `Gatto` o `Topo` ma non `Ratto`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come catturare parti di un'occorrenza (*external backreference*)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Gatto Cane***'\n", + "stringa2 = '***Oca Ratto***'\n", + "\n", + "print(stringa1)\n", + "print(stringa2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Estrarre le due sottostringhe `Gatto` e `Cane` da `stringa1` e le due sottostringhe `Topo` e `Ratto` da `stringa2`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**RIASSUMENDO...**\n", + "\n", + "Il meccanismo che cattura, tramite raggruppamenti, parti di occorrenza prende il nome di ***backreference esterno***.\n", + "\n", + "I raggruppamenti sono indicizzati da sinistra a destra a partire da 1.\n", + "\n", + "La parte catturata da un raggruppamento viene restituita dal metodo `group()` dell'oggetto `Match`:\n", + "\n", + " match_obj.group(index)\n", + " \n", + "dove l'argomento `index` è l'indice del raggruppamento da catturare. Se l'argomento non viene specificato, allora si assume l’indice di default 0 che corrisponde all'intera sottostringa catturata dalla RE.\n", + "\n", + "L'inizio e la fine della parte catturata da un raggruppamento viene restituita dai metodi `start()` ed `end()`:\n", + "\n", + " match_obj.start(index)\n", + " match_obj.end(index)\n", + " \n", + "Se l'argomento non viene specificato, allora si assume l’indice di default 0 che corrisponde all'intera sottostringa catturata dalla RE.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Come catturare parti di un'occorrenza da usare nella RE (*internal backreference*)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "stringa1 = '***Cane Gatto***'\n", + "stringa2 = '***Gatto Gatto***'\n", + "stringa3 = '***Cane Cane***'\n", + "\n", + "print(stringa1)\n", + "print(stringa2)\n", + "print(stringa3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Catturare le sottostringhe composte da una stessa parola ripetuta due volte con in mezzo degli spazi." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**RIASSUMENDO...**\n", + "\n", + "Il riferimento a raggruppamenti presenti nella RE da usare internamente all'operazione di matching prende il nome di ***backreference interno***. I riferimenti interni si rappresentano tramite i metasimboli \\1 , \\2 ,\n", + "\\3 etc., dove \\i si riferisce all'i-esimo raggruppamento a partire da sinistra.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### ESERCIZIO1" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'Cat cat Rat rat Bat bat'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Estrarre la lista `['Cat', 'Rat', 'Bat']`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### ESERCIZIO2" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'cat dog mouse rat'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Estrarre la lista `['cat dog', 'mouse rat']`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### ESERCIZIO3" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'aaaaaaaabbbbcccccccccccccccccccccccc'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Estrarre la lista dei *runs* dei simboli `a`, `b` e `c`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### ESERCIZIO4" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "stringa = 'aaaaaaaabbpppbbcccccccccccddddeeeeccccccccccccc'\n", + "print(stringa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Estrarre la lista dei *runs* di qualsiasi simbolo." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}