• Aucun résultat trouvé

Automates TP2 – Traitement de fux par automates

N/A
N/A
Protected

Academic year: 2022

Partager "Automates TP2 – Traitement de fux par automates"

Copied!
3
0
0

Texte intégral

(1)

Licence Math/Info - L1

Automates

TP2 – Traitement de fux par automates

Précisions sur les expressions régulières

:

Les caractères spéciaux pour écrire des expressions régulières :

• . : reconnaît n'importe quel caractère,

• | : disjonction de deux expressions

• ? / * / + : fermeture (répétition) au moins 0 / 0 / 1 fois et au plus 1 / n / n fois,

• {m,n} : répétition au moins m fois et au plus n fois

• [] : classe de caractères :

◦ [aciur] : un des caractères listés,

◦ [a-f] : tous les caractères (ici entre a et f),

◦ [a-Z] : caractères majuscules ou minuscules,

◦ [:alpha:] : classes de caractères, selon le logiciel (grep, sed, Java, Python, etc.),

◦ [^fgt] : complémentaire : n'importe quel caractère sauf ceux spécifés (ici f, g et t),

• () : pour isoler une sous expression,

• ^ / $ : reconnaît le début / la fn d'une ligne.

Attention : lorsque l'on veut trouver un de ces caractères spéciaux au sein d'un fux de données (par ex. un point « . » pour trouver une fn de phrase) il faut le faire précéder du caractère d'échappement « \ » (par ex. « \. »).

Les scripts shell

:

Un script shell est un fchier texte, avec extension « .sh » qui contient un ensemble de

commandes telles que vous les écrivez dans un terminal. Pour l'exécuter, il suft de le rendre exécutable avec la commande :

chmod u+x script.sh

Les commandes à l'intérieur du script peuvent fonctionner en mode « fux », à l'aide des commandes de redirection « | » (entre scripts) et « > » sortie vers un fchier:

cat test.txt | grep "bonjour" | sort > bonjours.txt

Les variables sont défnies et utilisées de la manière suivante : variable="Hello world"

echo $variable

Pour qu'une variable récupère le résultat d'une commande, faire $(cmd) : fchiers=$(ls)

echo $fchiers

Il est possible de faire des boucles qui auront alors la forme suivante : for fc in $fchiers; do

echo $fc

cat $fc | grep "test" > $fc_test.txt done

Les afchages simples se font avec la commande « echo » echo "Hello world"

echo $fchiers

Vous pouvez commentez (le code ou ajouter des explications avec « # »)

# Ici un code qui exécute l'expression régulière

(2)

Récupérer et analyser un fchier HTML

:

Le HTML est le langage utilisé pour structurer le contenu sur Internet. Chaque fchier HTML contient, au format texte, des « balises » qui peuvent prendre la forme suivante (attention au slash « / ») :

• une paire de balises :

◦ ouvrante : <balise attribut1="valeur1" attribut2="valeur2" ... >,

◦ fermante : </balise>,

• une balise « vide » : <balise attribut1="valeur1" attribut2="valeur2" ... />.

Pour récupérer le contenu d'un site web, nous enregistrons le code de la page. Dan un navigateur, allez sur la page sélectionnée. Consultez le « code source » de la page que vous pourrez copier / coller dans un un fchier, par exemple « site.html ». Sous Linux, la commande

« curl » peut-être utilisée pour ce faire.

1. Créez un script shell qui :

• enregistre une page de contenu du site (article) dans le fchier curl www.site.com/indexhtml > site.txt,

• afche combien il y a respectivement, dans « site.txt », de :

◦ balises HTML (en trouvant la bonne expression érgulière regexp) : nbbal=$(cat site.txt | grep -Eo "regexp" | wc -l)

echo "Il y a $nbbal balises dans le fchier"

◦ balises ouvrantes (idem sauf regexp),

◦ balises fermantes (idem sauf regexp),

◦ balises vides (idem sauf regexp),

◦ balises « liens » : « <a ... > ... </a> » (idem sauf regexp),

• enregistre dans un fchier séparé les :

◦ paragraphes (et leur contenu) : « <p ... > ... </p> », cat site.txt | grep -Eo "regexp" > site_liens.txt

◦ items de listes (et leur contenu) : « <li ... > ... </li> ».

cat site.txt | grep -Eo "regexp" > site_items.txt Capturer une partie de l'expression régulière

:

Les expressions régulière permettent de « capturer » (mémoriser) une partie de ce qui a été reconnu, lorsque cette partie est entre parenthèses. Par exemple, « a(b*)c », la partie entre parenthèses est capturée et stockée dans une variable « \1 » qui peut-être utilisée plus loin dans l'expression régulière. De manière général, on peut utiliser « \x » où « x » est le numéro de la parenthèse ouvrante.

Ainsi, « a(b*c*)d\1e » reconnaît une expression commençant par un « a », suivi de 0 ou plusieurs « b » et « c », puis un « d », enfn la même chaîne de « b » et « c » que

précédemment, enfn un « e ».

2. Créez un script shell qui :

◦ enregistre dans un fchier les titres : « <h1...> ... </h1> », « <h2 ... > ... </h2> »,

◦ enregistre toutes les balises en doublons,

◦ enregistre les lignes qui ont deux fois des balises de liens, paragraphes ou titres,

◦ enregistre les lignes qui ne contiennent pas de balise ouvrantes qui soit fermées (dans grep, utilisez « -Ev » pour inverser les résultats et afcher les lignes).

Efectuer des remplacements dans un fux de données

:

Il est possible, de la même manière que « grep » reconnaît des expressions régulières, de faire des remplacements en sortie. La commande « sed » (Stream EDitor) efectue ce type d'opérations, lorsque l'on fournit une expression régulière et ce qui doit remplacer les occurrences :

sed -r "s#expression#remplacement#g" (ici nous utilisons « # » pour séparer les parties de la commande, mais

habituellement « / » ou « | » sont utilisés)

(3)

3. Créez un script shell qui enregistre dans des fchiers le site où :

◦ chaque occurrence de la chaîne « info » est remplacés par « INFO » : cat site.txt | sed "cmd" > site_info.html

◦ chaque occurrence de « Sarkozy » est remplacée par « Obama »,

◦ toutes les images sont efacées («<img... /> »).

4. Créez un script shell qui afche toutes les classes CSS distinctes(« <balise class="..."> »).

5. Créez un script shell qui :

◦ enregistre dans une variable toutes les URL des liens présents dans le site :

▪ « <a ... href="URL" ... /> »

◦ pour chaque lien (grâce à une boucle « for ») :

▪ afche l'URL,

▪ enregistre la page web (grâce à « curl ») dans un dossier « liens »,

◦ pour chaque page web enregistrée dans le dossier (avec « ls ») :

▪ enregistre le fchier sans aucune balise dans un fchier avec extension « .txt »,

◦ remplace les URL des liens du fchier « site.txt » pour qu'ils pointent vers « ./liens/ » au lieu du site d'origine.

6. Faites de même pour :

• les images : « <img... src="URL ... /> »

• les feuille de style CSS : « <link type="text/css" href="URL" ... /> » Efectuer des remplacements avec captures dans un fux de données

:

Il est possible de remplacer une partie de l'expression régulière avec ce qui a été capturé.

Pour cela, utilisez le même mécanisme de capture « \x » tout en faisant des remplacements à, l'aide de « sed ».

7. Créez un script shell qui enregistre dans des fchiers le site où :

◦ les images ont un attribut « width="100px" » (« <img ... width="100px" ... /> »),

◦ sont remplacées l'URL et le titre du lien :

« <a href="url">titre</a> » devient « <a href="titre">url</a> »,

◦ est recopiée la classe CSS d'un élément précédée de « CSS: » :

« <balise class="cl">... » devient « <balise class="cl">CSS:cl... »,

◦ sont échangées les imbrications de code HTML à deux niveaux :

« <balise1> ... <balise2> ... </balise2> ... </balise1> »

devient « <balise2> ... <balise1> ... </balise1> ... </balise2> ».

8. Faites une proposition (dans un fchier texte, ou codez-la en script shell) de la manière dont il serait possible d' « aspirer » un site web :

• créez les dossiers à l'image des URLs (le « / » sépare un dossier de son contenu),

• enregistrer tous les fchiers,

• faire en sorte que le site fonctionne « localement » : les liens, images, styles, etc.

pointent vers les répertoires sur la machine.

Références

Documents relatifs

Automates finis Automates finis à comportement déterminé Langage associé à un automates de Moore Automates finis à comportement non déterminé Détermination d’un AFDN..

Nous ne savons toujours pas ce que le gouvernement attend pour remédier à cet état de fait : non seulement il ne met en place aucune politique d’embauche supplémentaire pour

Pour calculer algorithmiquement une expression rationnelle pour chacun d’eux, il suffit donc d’utiliser récursivement le procédé d’élimination basé sur le lemme

[^ac] reconnaît n'importe quel caractère sauf a et c, ou [^0-9] reconnaît n'importe quel caractère qui n'est pas numérique. A l'aide des classes de caractères, cherchez les

Donnez un automate non-déterministe sur Σ ={0, 1, 2, 3, 4, 5, 6, 7, 8, 9} qui accepte les mots dont le dernier chiffre soit un chiffre qui ait déjà apparu...

● Pour la lisibilité, lorsque deux arcs de même orientation sont possibles entre deux nœuds, ils sont fusionnés (disjonction) :. ● Un arc peut « boucler » un état

Pour chacune des expressions rationnelles suivantes, construire un automate reconnaissant le lan- gage qu’elles d´enotent :.. (Calcul sur des

Écrivez un automate déterministe qui reconnaisse la présence du mot “concom- bre” ou du mot “braconnier” dans un texte, attention, les mots ne sont pas forcément séparés par