Utente:GiacoBot/Regexp

Ovvero tutto quello che avete sempre voluto sapere sui bot, avete osato chiedere, ma non avete capito lo stesso...
Questa pagina è di per sè un continuo work in progress: tutto quello che metto qui è perchè GiacoBot ha imparato a farlo...
Se ritieni che qualche cosa qui presente possa essere una tua creazione, è quasi certamente così... Se non vuoi vederla qui, segnalamelo pure...
Grazie un po' per tutto a BomBot, FilBot, AlfioBot, X-Bot. Grazie ancora di più, ovviamente, ai loro creatori...

Creare un botModifica

Riguardo alla creazione da zero di un botolo, ti rimando all'ottima guida in cinque passi a cura di Filnik...

Per iniziare a lavorare...Modifica

Per iniziare a fare i primi lavoretti, occorre anzitutto aprire il prompt del DOS (Windows) e digitare cd C:\\pywikipedia (se hai salvato il pacchetto in un luogo diverso, sostituiscine il percorso esatto). Devi quindi fare il login, digitando login.py (va fatto solo all'inizio, ovviamente)... La prima volta devi settare il login.py con le info specifiche del tuo botolo (come? clicca qui)...

A questo punto sei pronto per inserire un comando (non ridete, io c'ho messo un po'...) che può (deve?) contenere i seguenti pezzi:

  • il nome del file .py (o script) da usare: per ognuno vedi i sottotitoli delle sezioni seguenti;
  • il sito di inizio dell'applicazione del comando: dopo -start: mettere la lettera (o comunque la voce) di inizio analisi (-start:!=inizio elenco, -start:g=inizio dalla G); se si desidera lavorare solo, ad esempio, sui template, si può digitare -start:Template:A (ed in modo simile con tutti gli altri namespace);
  • in alternativa al comando -start:, si può restringere il tutto ad una sola pagina, con il parametro -page (ad esempio, -page:nomepagina); si può scrivere più volte nel comando per lavorare su più pagine; può essere utile soprattutto in fase di test, creandosi una sandbox all'uopo (tipo Utente:GiacoBot/Sabbionaia) per testare le regex.

replace.pyModifica

Un parametro che si può aggiungere alla riga di comando è -always: il suo inserimento genera sostituzione automatica, senza richiesta volta per volta (da usare solo se si è certi della bontà del comando impartito). Altri parametri utili per restringere e specificare l'analisi:

  • -links: il suo inserimento genera l'analisi solo delle pagine collegate ad una pagina specifica (ad esempio -links:Algeria analizza tutte le pagine linkate da Algeria).
  • -file: lavora su tutte le pagine indicate in un file di testo contenuto nella cartella pywikipedia (ad esempio, -file:filename), cercando i wikilink di tutti i termini contenuti;
  • -cat: lavora su tutte le pagine di una specifica categoria (ad esempio, -cat:nomecategoria);
  • -ref: lavora su tutte le pagine che hanno un link verso una determinata pagina (ad esempio: -ref:pagina);
  • -except: non modifica le pagine che hanno un determinato contenuto (se ad esempio si inserisce -except:abc, il comando sarà valido su tutte le voci che non contengono il testo abc

EsempiModifica

Alcune regex relative al replace.py, che fa sostituzioni (l'oggetto della modifica va riportato come "termine da sostituire" "termine sostituito").
Alcuni esempi (grazie a Filbot):

  • Perchè >> Perché
replace.py -start:! -regex "([Pp])erch(è|[e'])" "\1erché"
  • Perchè >> Perché (e checchè, affinchè, alcunchè, giacchè, finchè, sicchè, poichè, benchè, acciocchè, fuorchè, macchè, da usare solo in modalità manuale[1])
replace.py -regex -start:! "([Cc]hec|[Pp]er|[Aa]ffin|[Aa]lcun|[Gg]iac|[Ss]ic|[Ff]in|[Pp]oi|[Bb]en|[Aa]ccioc|[Ff]uor|[Mm]ac)ch(è|e['])([^'.])" "\1ché\3"
  • E' >> È (escludendo le E'', le E'S e le E's)
replace.py -regex -start:! "([^D])E'([^'.])" "\1È\2"
  • Vedi Anche >> Voci correlate
replace.py -start:! -regex "== ?[Vv]edi [Aa]nche ?==" "== Voci correlate =="
  • Nè o ne' >> né (da usare solo in modalità manuale)
replace.py -regex -start:! " n(è|e['`´‛’]) " " né "
  • Pò >> po' (da usare solo in modalità manuale)
replace.py -regex -start:! " pò" " po'"

Oggetto di sostituzione troppo lungoModifica

Se l'oggetto di sostituzione è troppo lungo, l'estetica della cronologia ne soffre (ed anche la pazienza dei patrollatori): può dunque essere utile modificare il file replace.py aggiungendo uno specifico -fix. Ad esempio, se inserite direttamente nella riga di comando la seguente regex

replace.py -regex -start:! "([Cc]hec|[Pp]er|[Aa]ffin|[Aa]lcun|[Gg]iac|[Ss]ic|[Ff]in|[Pp]oi|[Bb]en|[Aa]ccioc|[Ff]uor|[Mm]ac)ch(è|e['])([^'.])" "\1ché\3"

vi troverete a che fare con oggetti di modifica mostruosi come questo... Un modo per risolvere il problema può essere quello di fare anzitutto una copia di sicurezza del file replace.py e di provare a modificarlo inserendo una sintassi del genere

'nomefix': {
       'regex': True,
       'msg': {
              'it':u' Bot: inversione accenti'
             },
       'replacements': [
(u"(?m)([Cc]hec|[Pp]er|[Aa]ffin|[Aa]lcun|[Gg]iac|[Ss]ic|[Ff]in|[Pp]oi|[Bb]en|[Aa]ccioc|[Ff]uor|[Mm]ac)ch(è|e['])([^'.])", ur"\1ché\3"),
       ]
   },

subito prima di

}
class XmlDumpReplacePageGenerator:

Nella riga di comando adesso si dovrà usare il parametro -fix, che richiami la modifica specifica (nomefix ovviamente può essere modificata a piacimento) all'interno del file. Dunque (ad esempio):

replace.py -start:! -fix:nomefix

Il risultato è una cosa del genere, evidentemente più fine (e umana)... Lo script completo di questo esempio specifico lo trovi anche qui...

Ovviamente, prima di utilizzare in automatico la funzionalità di questi pasticcetti, occorre un congruo numero di prove manuali...

Quando diventi bravino...Modifica

Quando ti senti più sicuro (ed il tuo bot ha avuto la fiducia della comunità), puoi iniziare a pensare di scrivere tu stesso delle regex (senza rubarle per forza ad altri...): puoi trovare un sito utile per imparare qui.
Non dimenticare, in ogni caso, che puoi dare un'occhio anche al manuale presente su meta: le prime cose ormai le saprai fare bene, ma esso contiene una dettagliata descrizione di molti script presenti nel pacchetto (se poi vuoi tradurne qualcuno dall'inglese...)...

Che vuol dire?Modifica

  1. ^ Modalità manuale: fai partire il comando e, ad ogni proposta di sostituzione, digiti ogni volta [y] o [n] e non [a]ll, che sostituisce tutto in automatico; da usare per comandi non sufficientemente testati e/o affidabili