Le défi du Machine Learning Lab de l'Université de Trieste (Italie) propose de résoudre 12 problèmes et le niveau des tâches varie considérablement - de très facile à difficile.
Bien sûr, il peut y avoir plus d'une solution et les cas de test dans le problème ne couvrent pas toutes les options. Néanmoins, si vous marquez 100%, alors félicitations! Test réussi.
Spoiler: dans certaines tâches (surtout les plus légères), un indice est pratiquement une solution.
Tâche 1 - trouver les chiffres
Il y a du texte contenant des nombres, vous devez trouver tous les nombres.
Difficulté: super facile.
IndiceVous devez utiliser un caractère numérique et un quantificateur multiplicateur.
Solution\ d +
"[0-9] +" est également la bonne décision.
Solution d'analyse- "\ d" ou "[0-9]" - n'importe quel caractère unique de 0 à 9.
- "+" - un ou plusieurs caractères sont autorisés.
Tâche 2 - Rechercher des adresses MAC
Il y a du texte contenant des adresses mac, vous devez les trouver.
Difficulté: facile.
IndiceVous devez utiliser un caractère signifiant n'importe quel caractère d'une lettre ou d'un chiffre, deux points pour séparer et un quantificateur multiplicateur.
Solution\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}
"+" au lieu de "{2}" est également la bonne décision, bien qu'elle ne soit pas tout à fait exacte.
Solution d'analyse- "\ w" est n'importe quel caractère de l'alphabet ou n'importe quel nombre.
- "{2}" - seuls 2 caractères sont autorisés.
La meilleure solutionCeux qui connaissent l'adresse mac ont remarqué que l'adresse mac est écrite en notation hexadécimale. Et dans la solution précédente, le signe \ w était utilisé, ce qui signifie n'importe quel caractère de l'alphabet et tous les nombres. Je suis d'accord, ce n'est probablement pas nécessaire, mais vous pouvez en tenir compte, tout en réduisant la régularité.
([\ da-f] {2} :) {5} [\ da-f] {2}
Solution d'analyse- "\ d" est un chiffre unique, "af" est une plage de a à f. Au total, nous avons un jeu de caractères valide 0123456789abcdef - c'est-à-dire le code hexadécimal Hex. "{2}" - 2 caractères quelconques de ce jeu de caractères.
- "([\ da-f] {2} :)" {5} - la répétition de deux caractères hex + deux points est autorisée exactement 5 fois.
- et à la fin de "[\ da-f] {2}" - 2 caractères quelconques de l'ensemble hexadécimal
Tâche 3 - Rechercher des adresses FTP
Il y a du texte avec des adresses ftp, vous devez les trouver.
Difficulté: facile.
IndiceVous devez commencer par ftp: // puis lister les caractères valides dans l'adresse, sans oublier le quantificateur multiplicateur.
Solutionftp: \ / \ / [\ w \ d -_. \ /] +
Solution d'analyse- "\ /" - échappement normal du caractère "/".
- entre crochets se trouve une énumération de caractères valides, à savoir n'importe quel caractère de l'alphabet ou n'importe quel nombre, trait d'union, trait de soulignement, point ou barre oblique (s'il y a d'autres caractères dans le nom, vous pouvez les ajouter).
Tâche 4 - trouver un modèle
Il existe une sorte de fichier formaté dans lequel vous devez trouver toutes les lignes correspondant au motif $ tous les caractères $.
Difficulté: facile.
IndiceVous devez utiliser l'échappement du caractère réservé, le caractère de n'importe quel caractère, les quantificateurs de multiplicité et les paresseux.
SolutionUne tâche banale, mais qui nécessite une meilleure connaissance des habitués.
\\ $. +? \\ $
Solution d'analyse- "\\ $" est la projection en dollars.
- ". +" - n'importe quel nombre de caractères, "?" - supprimer la cupidité.
Tâche 5 - Rechercher des adresses IP
Trouvez des adresses IP dans le texte.
Difficulté: facile.
IndiceTrès similaire à la deuxième tâche.
Solution\ d + \. \ d + \. \ d + \. \ d +
Si au lieu de "+" vous avez écrit "{1,3}" alors vous avez terminé.
Solution d'analyse- "\ d" est un chiffre unique,
- "+" - n'importe quel nombre de caractères, "{1,3}" - une restriction stricte sur le nombre de caractères (de 1 à 3).
La meilleure solutionUne adresse IP n'est pas seulement des nombres, mais des nombres de 0 à 255.
\ b ((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} (\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \ b
Solution d'analysePour déterminer la plage de 0 à 255, vous devrez essayer un peu:
- "\ d" est un nombre de 0 à 9
- "[1-9] \ d" - un nombre de 10 à 99
- "1 \ d {2}" - un nombre de 100 à 199
- "2 [0-4] \ d" - un nombre de 200 à 249
- "25 [0-5]" - chilso de 250 à 255
Ensuite, nous autorisons la répétition du motif numérique de 0 à 255 exactement 3 fois:
- "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - à l'intérieur du point, car il répété 3 fois et à la fin la même gamme de chiffres, mais sans point.
- à la fin et au début, nous ajoutons le symbole de bordure du mot "\ b" - il est nécessaire pour supprimer ce texte "1172.30.42.109" de l'entrée (je suis d'accord, il est peu probable et probablement inutile).
Tâche 6 - Ancre
Tirez la balise href du document html.
Difficulté: moyenne.
IndiceUtilisez "n'importe quel caractère sauf" et "ou" pour chaque parenthèse.
Solutionhref = ("[^"] + "| '[^'] + ')
Solution d'analyse- "- lancez la recherche avec un double guillemet.
- "[^"] + "- encore plus n'importe quel caractère, sauf les guillemets doubles.
- Nous terminons par une double citation.
Nous mettons tout cela entre parenthèses, ajoutons le signe ou - "|" et répétez la même chose pour les guillemets simples.
Tâche 7 - Liens
Dans n'importe quel texte, trouvez tous les liens. La tâche est compliquée par le fait qu'il ne suffit pas de trouver le lien, vous devez supprimer les caractères invalides à la fin.
Difficulté: difficile.
IndiceVous devez commencer par http, utiliser "n'importe quel caractère sauf" et terminer la recherche avec un caractère valide.
Solutionhttp: \ / \ / ([^> \ s] +) [\ w \ /]
Il n'y a pas de lien https dans la tâche, mais vous pouvez en tenir compte en ajoutant "s?" après http.
Solution d'analyse- "[^> \ s] +" recherche tous les caractères sauf le caractère ">" et le caractère espace. En fait, vous pouvez lire comme ceci "nous allons jusqu'à ce que nous voyions un de ces symboles."
- "[\ w \ /]" est un délimiteur qui permet à un lien de se terminer uniquement par un caractère latin ou une barre oblique.
Et en conséquence - nous commençons par http: //, puis absolument n'importe quel caractère à l'exception des caractères "<" ou de l'espace, mais à la fin, le caractère latin ou la barre oblique est requis.
- "s?" supplémentaire dans "https?" autorisez simplement "http: //" et "https: //".
Tâche 8 - En-têtes
En HTML, un en-tête est une balise h + chiffre.
Difficulté: moyenne.
IndiceCommencez par h + chiffre + n'importe quel caractère ou son absence.
SolutionAssez simple:
<h \ d. *>. * <\ / h \ d. *>
Solution d'analyse- "h \ d" - ici, nous disons qu'après le caractère doit nécessairement aller "\ d" chiffre.
- Et puis ". *" Peut aller n'importe quel nombre de caractères ou rien ne peut aller.
La meilleure solutionAprès h vient un chiffre, et la spécification html indique que les nombres de 1 à 6 sont valides, et la balise elle-même ne peut pas être fermée par autre chose que des crochets triangulaires. Par conséquent, cette solution sera plus précise:
<h [1-6] [^>] *>. +? <\ / h [1-6]>
Certes, il y a une erreur vous permettant d'ouvrir la balise avec un chiffre et de fermer l'autre. Et par conséquent, une solution encore plus précise serait d'utiliser les liens: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Cela ne veut pas dire que le test n'est pas sensible à la casse.
Solution d'analyse- "h [1-6]" - ici nous disons qu'après "h" le nombre doit aller de 1 à 6.
- "[^>] *" - tout caractère sauf ">" peut continuer ou ne pas continuer.
Séparément, sur l'ajout:
- En enveloppant l'expression "(h [1-6])" entre crochets, nous créons un groupe au numéro 1.
- De plus, en utilisant le lien vers le premier groupe "\ 1", nous parlons de ce que nous voulons voir à la fin de la même, h avec le même nombre qu'au début.
Tâche 9 - Téléphones
En texte libre trouvé dans tous les téléphones dans différents formats.
Difficulté: difficile.
IndiceIl faut utiliser le signe de la présence d'un symbole ou de son absence, un quantificateur pour limiter le nombre de chiffres, et la construction d'un jeu de caractères. Conception possible ou.
Solution\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}
Cela fonctionnera, mais il autorise deux caractères après les trois premiers chiffres - c'est bien si c'est une parenthèse fermante et un espace après, mais c'est mauvais s'il y a deux tirets. Par conséquent, il existe une solution légèrement plus précise: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"
Solution d'analyse- "\ (?" - nous indiquons la possibilité de la présence du symbole "(" ou son absence, nous le bouclons puisqu'il s'agit d'un symbole réservé.
- "\ d {3}" - chiffres avec une restriction de seulement 3.
- D'autres caractères "[\). \ / -] {1,2}" sont possibles - barre oblique, parenthèse fermante, point, espace, barre oblique inverse et trait d'union. {1,2} - indique que ces caractères peuvent être 1 ou 2. Par exemple, le crochet de fermeture et l'espace après celui-ci.
- En outre nécessairement "[-.]" - un tiret ou une période.
- Et "\ d {4}" correspond aux quatre chiffres à la fin.
Tâche 10 - Auteurs
Il y a un certain modèle contenant des éléments, trouvez tous les auteurs dans le champ auteur.
Difficulté: très difficile.
IndiceIl est nécessaire de s'appuyer sur le fait que tous les noms d'auteurs commencent par une majuscule et sont écrits selon un modèle.
Solution[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?
Cette solution est correcte, mais elle a un inconvénient. Nous nous sommes promenés "{\" u} avec une "béquille" ({\ "\ w})?" et, fondamentalement, cela peut fonctionner si vous mettez également cette béquille dans d'autres parties du nom des auteurs.
Dans tous les cas, si vous avez réussi à résoudre ce problème, c'est très cool!
Solution d'analyse- "[AZ] [A-Za-z - '] +" - Nous recherchons un mot qui commence nécessairement par une majuscule, puis contient tout caractère alphabétique, trait d'union ou apostrophe.
- De plus, tout est exactement la même chose qu'un peu plus haut, mais ici entre nous avons "({\" \ w})? "- c'est juste une béquille qui vous permet de contourner le blindage. Cela signifie qu'un morceau de" {\ "u}" peut être présent ou être absent.
- Et là encore, exactement la même chose que dans le premier cas "([AZ] [A-Za-z - '] *)?", La remarque est à l'exception que cette expression est enveloppée dans un groupe et qu'il y a un "?" ce qui signifie ne pas lier cette condition.
L'énumération PS [A-Za-z] est ici une mesure nécessaire, car il n'y a pas de modificateurs dans le test.
La meilleure solutionIl existe une solution plus compacte et simple qui vous permet d'abandonner la béquille ci-dessus:
[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B
Solution d'analyse- "[AZ] \ S +", - d'abord, nécessairement, la lettre majuscule "[AZ]", puis n'importe quel nombre de caractères non blancs "\ S +" jusqu'au point-virgule ",".
- En outre, presque le même "[AZ] \ S *" - le début est nécessairement avec une lettre majuscule, puis tout caractère non blanc à la frontière du mot "\ b".
- "([AZ] [\ S] *)?" - et entre eux le même groupe, mais pas obligatoire, pour un deuxième prénom.
Tâche 11 - Contenu de l'en-tête
Tout comme dans la tâche 8, mais vous devez trouver non pas les en-têtes eux-mêmes, mais leur contenu.
Difficulté: difficile.
IndiceLa tâche est identique à la tâche 8. Ce n'est pas difficile si vous savez regarder en arrière. A une solution avec regarder en arrière et sans regarder en arrière.
SolutionSans regarder en arrière:
([\ w] * <[^ h]. + | [^ <>] +) (? = <\ / h \ d>)
Solution d'analyse- "([\ w] * <[^ h]. + | [^ <>] +)" - il existe deux options pour commencer le contenu de l'en-tête. La première est avec la balise à l'intérieur de "[\ w] * <[^ h]. +" - en même temps, vous devez vous assurer que ce n'est pas la balise h et tenir compte du fait qu'il peut y avoir du texte avant la balise. La deuxième option est le texte sans balises "[^ <>] +", c'est-à-dire tous les caractères autres que l'ouverture et la fermeture de la balise.
- "(? = <\ / h \ d>)" - regardant vers l'avant, à l'intérieur duquel il devrait y avoir une balise de fermeture h.
Rétrospective:
(? <= <h [^>] +>). +? (? = <\ / h \ d>)
De plus, vous pouvez prendre en compte tous les commentaires sur la solution 8 du problème.
Solution d'analyse- "(? <= <h [^>] +>)" - jetant un coup d'œil à l'intérieur de laquelle devrait être une balise h.
- "(? = <\ / h \ d>)" - regardant vers l'avant, à l'intérieur duquel il devrait y avoir une balise de fermeture h.
Tâche 12 - Liste des auteurs
La tâche est similaire à la 10e tâche, mais à mon avis est plus facile.
Difficulté: difficile.
IndiceTous les principes de base des 10 tâches, mais vous devez considérer le début de la ligne. La solution que je connais utilise un coup d'œil en arrière.
Solution(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +
Solution d'analyse- "(? <= ^ \ d +.)" - en regardant en arrière où vous devez avoir n'importe quel nombre de chiffres jusqu'au point avec un espace à partir d'une nouvelle ligne.
- "[AZ] [\ w] +", - déplacez n'importe quel mot d'une lettre majuscule vers un point-virgule et encore une fois le même "[AZ] [\ w.] +".
Ou simplement, ceci:
(? <= ^ \ d + \.) [^,] +, [^,:] +
Solution d'analyse- "(? <= ^ \ d +.)" - en regardant en arrière où vous devez avoir n'importe quel nombre de chiffres jusqu'au point avec un espace à partir d'une nouvelle ligne.
- "[^,] +," - n'importe quel nombre de caractères de la virgule + virgule.
- "[^,:] +" - n'importe quel nombre de caractères avant la virgule ou les deux-points.