L3 Info Paris 7 Linguistique - Examen 2016-2017 Eléments de corrections (non officiels) ======================================================================================== Exercice 1.1 ==Méthode== Traduire la phrase en un ensemble de contraites, les mettre dans l'ordre, traduire les contraintes une par une en expression régulière, et les rassembler. Ecrire éventuellement quelques exemples pour vérifier. ============================================ 1) Minuscules en début et fin ==Traduction de la phrase== Une minuscule, puis une suite de caractères quelconques (éventuellement vides), puis une autre minuscule - une minuscule : [a-z] - suite de caractères : .* (le point désigne un caractère quelconque, y compris les espaces et les caractères spéciaux) - une minuscule : [a-z] ==Exemples== - ab - salut - c'EST PAS FAUx - ga0 bu1 zo2 3meu - a&é"'(-è_çà)=~#{[|`\^@]},;:!?./§a ==Réponse== [a-z].*[a-z] ============================================ 2) Les adresses IP Question difficile, à garder pour la fin ! ==Traduction de la phrase== On ne peut pas directement écrire l'intervalle [0-255] en regex. Il faut étudier tous les cas possibles, caractère par caractère. Pour ça, on va les découper en plusieurs intervalles. - de 0 à 9 : [0-9] - de 10 à 99 : [1-9][0-9] - de 100 à 199 : 1[0-9][0-9] - de 200 à 249 : 2[0-4][0-9] - de 250 à 255 : 25[0-5] Ce qui donne la formule suivante pour un nombre entre 0 et 255 : [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5] Exemple : 255 Il faut ensuite que le nombre soit suivi d'un point : ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\. Exemple : 255. On répète le tout 3 fois : (([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3} Exemple : 255.255.255. Et on ajoute un dernier nombre entre 0 et 255, mais sans le point (il faut donc réécrire la première partie) : (([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) Exemple : 255.255.255.255 ==Réponse== (([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) ==Autre méthode== On aurait pu factoriser un peu plus pour avoir une formule finale légèrement moins longue. Par exemple, pour les nombres de 0 à 99 qu'on a écrit [0-9]|[1-9][0-9] On aurait pu écrire [1-9]?[0-9] ============================================ 3) Espaces et mot ==Traduction de la phrase== Une suite d'espaces (éventuellement vide), puis une majuscule, puis une suite d'autres lettres (éventuellement vide). Le sujet ne précise pas s'il peut y avoir d'autres majuscules (on supposera que oui) ni s'il peut y avoir des chiffres ou des caractères spéciaux (on supposera que non). - suite d'espace : [\s]* - une majuscule : [A-Z] - suite de lettres : [A-Za-z]* ==Exemples== - A - Hey - WinterIsComing ==Réponse== [\s]*[A-Z][A-Za-z]* ============================================ 4) Les entiers impairs ==Traduction de la phrase== Une suite quelconque de chiffres (éventuellement vide) suivie d'un chiffre impair (1, 3, 5, 7 ou 9) - suite de chiffres : [0-9]* - chiffre impair : [1|3|5|7|9] ==Exemples== - 7 - 23 - 1729 - 123456789 - 2222222222221 ==Réponse n°1 (simple)== [0-9]*[1|3|5|7|9] ==Autre raisonnement possible== La réponse précédente autorise les nombres commençant par des zéros. Tels que : 00000000003 Doit-on autoriser ce nombre ? Si on juge que non, on doit chercher une autre réponse qui exclu ces nombres. Considérons indépendament le cas du nombre à un chiffre et du nombre à plusieurs chiffres (qui ne commence pas par des zéros) : - nombre impair à un chiffre : [1|3|5|7|9] - nombre impair à plusieurs chiffres: [1-9][0-9]*[1|3|5|7|9] En considérant les 2 cas possible, on obtient la formule suivante : [1|3|5|7|9]|[1-9][0-9]*[1|3|5|7|9] Et en la factorisant un peu, on obtient la formule suivante : ([1-9][0-9]*)?[1|3|5|7|9] ==Réponse n°2 (meilleure)== ([1-9][0-9]*)?[1|3|5|7|9] ============================================ ======================================================================================== Exercice 1.2 ==Méthode== Analyser l'expression signe par signe, traduire chaque partie indépendamment, écrire éventuellement quelques exemples pour vérifier, puis traduire le résultat en langage courant. Ne pas tenir compte des deux "/" à gauche et à droite qui marquent juste le début et la fin de l'expression régulière. ============================================ 1) [A-Z][a-z]* ==Analyse de l'expression== - [A-Z] : une lettre majuscule - [a-z]* : une suite quelconque de lettres minuscules (éventuellement vide) ==Exemples== - A - Ab - Abc - Targaryen ==Réponse== L'expression reconnait les mots d'au moins une lettre commençant par une majuscule. ============================================ 2) \d+(\.\d+)? ==Analyse de l'expression== - \d+ : une suite d'au moins un chiffre décimal (\d est équivalent à [0-9]) - (___)? : la partie entre les parenthèses est optionnelle (elle peut être présente ou pas) - \. : un point - \d+ : une suite d'au moins un chiffre décimal ==Exemples== - 7 - 42 - 3.14159 - 161.8033 ==Réponse== L'expression reconnait les nombres entiers et les nombres décimaux. ============================================ 3) \w+\|[^\w\s]+ ==Analyse de l'expression== - \w+ : une suite d'au moins un caractère alphanumérique (\w est équivalent à [A-Za-z0-9]) - \| : une barre verticale (aussi appelée "tube" ou "pipe") - [^\w\s]+ : une suite d'au moins un caractère qui ne sont ni alphanumérique ni des espaces (c'est-à-dire une chaine de "caractères spéciaux") ==Exemples== - A|!?£$% - abcABC123|[](){} - Hello42||||| - toto|\ ==Réponse== L'expression reconnait les lignes constituées d'au moins un caractère alphanumérique, suivi d'une barre verticale, suivie d'un moins un caractère spécial. ============================================