Pasamos el desafío RegexPlay 100%

El desafío del Laboratorio de Aprendizaje Automático de la Universidad de Trieste (Italia) ofrece resolver 12 problemas y el nivel de tareas varía enormemente, de súper fácil a difícil.


Por supuesto, puede haber más de una solución, y los casos de prueba en el problema no cubren todas las opciones. Sin embargo, si obtiene un puntaje del 100%, ¡felicidades! Prueba aprobada


Spoiler: en algunas tareas (especialmente las ligeras), una pista es prácticamente una solución.


Tarea 1: encuentra los números


Hay texto que contiene números, necesita encontrar todos los números.


Dificultad: superfácil.


Pista

Debe usar un carácter de dígito y un cuantificador multiplicador.


Solución
\ d +

"[0-9] +" también es la decisión correcta.


Solución de análisis
  • "\ d" o "[0-9]" es cualquier carácter individual de 0 a 9.
  • "+": se permiten uno o más caracteres.

Tarea 2: buscar direcciones mac


Hay texto que contiene direcciones mac, debe encontrarlas.


Dificultad: fácil.


Pista

Debe usar un carácter que signifique cualquier carácter de una letra o número, dos puntos para separar y un cuantificador multiplicador.


Solución
\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}

"+" en lugar de "{2}" también es la decisión correcta, aunque no es completamente precisa.


Solución de análisis
  • "\ w" es cualquier carácter del alfabeto o cualquier número.
  • "{2}": solo se permiten 2 caracteres.

Mejor solucion

Aquellos familiarizados con la dirección mac han notado que la dirección mac está escrita en notación hexadecimal. Y en la solución anterior, se usó el signo \ w, lo que significa cualquier carácter del alfabeto y todos los números. Estoy de acuerdo, probablemente esto sea innecesario, pero puede tener esto en cuenta, al mismo tiempo que reduce la regularidad.


([\ da-f] {2} :) {5} [\ da-f] {2}

Solución de análisis
  • "\ d" es cualquier dígito individual, "af" es un rango de a a f. En total, tenemos un juego de caracteres válido 0123456789abcdef, es decir, el código hexadecimal Hex. "{2}": cualquier 2 caracteres de este conjunto de caracteres.
  • "([\ da-f] {2} :)" {5}: repetir dos caracteres hexadecimales + dos puntos se permite exactamente 5 veces.
  • y al final de "[\ da-f] {2}" - cualquier 2 caracteres del conjunto hexadecimal

Tarea 3: buscar direcciones ftp


Hay texto con direcciones ftp, necesita encontrarlas.


Dificultad: fácil.


Pista

Debe comenzar con ftp: // y luego enumerar los caracteres válidos en la dirección, sin olvidar el cuantificador multiplicador.


Solución
ftp: \ / \ / [\ w \ d -_. \ /] +

Solución de análisis
  • "\ /" - escape normal del carácter "/".
  • dentro de los corchetes hay una enumeración de caracteres válidos, es decir, cualquier carácter del alfabeto o cualquier número, guión, guión bajo, punto o barra diagonal (si hay otros caracteres en el nombre, puede agregarlos).

Tarea 4: busque una plantilla


Hay algún tipo de archivo formateado en el que necesita encontrar todas las líneas que coinciden con el patrón $ cualquier carácter $.


Dificultad: fácil.


Pista

Debe usar el escape del carácter reservado, el carácter de cualquier carácter, los cuantificadores de multiplicidad y el vago.


Solución

Una tarea común, pero requiere un poco mejor conocimiento de los clientes habituales.


\\ $. +? \\ $

Solución de análisis
  • "\\ $" es la proyección del dólar.
  • ". +" - cualquier número de caracteres, "?" - Eliminar la codicia.

Tarea 5: buscar direcciones IP


Encuentra las direcciones IP del texto.


Dificultad: fácil.


Pista

Muy similar a la segunda tarea.


Solución
\ d + \. \ d + \. \ d + \. \ d +

Si en lugar de "+" escribiste "{1,3}", entonces has terminado.


Solución de análisis
  • "\ d" es cualquier dígito individual,
  • "+" - cualquier número de caracteres, "{1,3}" - una restricción estricta en el número de caracteres (de 1 a 3).

Mejor solucion

Una dirección IP no son solo números, sino números del 0 al 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

Solución de análisis

Para determinar el rango de 0 a 255, deberá probar un poco:


  • "\ d" es un número del 0 al 9
  • "[1-9] \ d" - un número del 10 al 99
  • "1 \ d {2}": un número del 100 al 199
  • "2 [0-4] \ d" - un número de 200 a 249
  • "25 [0-5]" - chilso de 250 a 255

A continuación, permitimos la repetición del patrón de dígitos de 0 a 255 exactamente 3 veces:


  • "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" es un punto en el interior porque también repite 3 veces y al final el mismo rango de números, pero sin un punto.
  • al final y al principio agregamos el símbolo de borde de la palabra "\ b" - es necesario para eliminar dicho texto "1172.30.42.109" de la entrada (estoy de acuerdo, es poco probable y probablemente innecesario).

Tarea 6 - Ancla


Extraiga la etiqueta href del documento html.


Dificultad: media.


Pista

Use "cualquier carácter excepto" y "o" para cada paréntesis.


Solución
href = ("[^"] + "| '[^'] + ')

Solución de análisis
  • "- comienza la búsqueda con una comilla doble.
  • "[^"] + "- además absolutamente cualquier carácter excepto una comilla doble.
  • Terminamos con una cita doble.

Ponemos todo esto entre paréntesis, agregamos el signo o - "|" y repita lo mismo para comillas simples.


Tarea 7 - Enlaces


En cualquier texto encuentre todos los enlaces. La tarea se complica por el hecho de que no es suficiente solo para encontrar el enlace, sino que debe eliminar caracteres no válidos desde el final.


Dificultad: difícil.


Pista

Debe comenzar con http, usar "cualquier carácter excepto" y finalizar la búsqueda con un carácter que sea válido.


Solución
http: \ / \ / ([^> \ s] +) [\ w \ /]

No hay enlaces https en la tarea, pero puede tener esto en cuenta agregando "s?" después de http.


Solución de análisis
  • "[^> \ s] +" busca cualquier carácter excepto el carácter ">" y el carácter de espacio. De hecho, puedes leer así "vamos hasta que veamos uno de estos símbolos".
  • "[\ w \ /]" es un delimitador que permite que un enlace termine solo con un carácter latino o una barra diagonal.

Y como resultado, comenzamos con http: //, luego absolutamente cualquier carácter, excepto los caracteres "<" o espacio, pero al final se requiere el carácter latino o la barra diagonal.


  • "s extra" en "https?" solo permita tanto "http: //" como "https: //".

Tarea 8 - Encabezados


En HTML, un encabezado es cualquier etiqueta h + dígito.


Dificultad: media.


Pista

Comience con h + dígito + cualquier carácter o su ausencia.


Solución

Bastante simple:


<h \ d. *>. * <\ / h \ d. *>

Solución de análisis
  • "h \ d": aquí decimos que después del carácter debe ir necesariamente el dígito "\ d".
  • Y luego ". *" Puede ir a cualquier número de caracteres o nada puede ir.

Mejor solucion

Después de h aparece un dígito, y la especificación html establece que los números del 1 al 6 son válidos, y que la etiqueta en sí no puede cerrarse con otra cosa que no sean corchetes triangulares. Por lo tanto, esta solución será más precisa:


<h [1-6] [^>] *>. +? <\ / h [1-6]>

Es cierto que hay un error que le permite abrir la etiqueta con un dígito y cerrar el otro. Y por lo tanto, una solución aún más precisa sería usar los enlaces: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Esto no quiere decir que la prueba no distinga entre mayúsculas y minúsculas.


Solución de análisis
  • "h [1-6]": aquí decimos que después de "h" el número debe ir del 1 al 6.
  • "[^>] *": cualquier carácter excepto ">" puede continuar o no.

Por separado, sobre la adición:


  • Envolviendo la expresión "(h [1-6])" entre paréntesis, creamos un grupo en el número 1.
  • Además, usando el enlace al primer grupo "\ 1" hablamos de lo que queremos ver al final del mismo, h con el mismo número que al principio.

Tarea 9 - Teléfonos


En texto libre se encuentra en todos los teléfonos en diferentes formatos.


Dificultad: difícil.


Pista

Es necesario utilizar el signo de la presencia de un símbolo o su ausencia, un cuantificador para limitar el número de dígitos y la construcción de un conjunto de caracteres. Posible diseño o.


Solución
\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}

Funcionará, pero permite dos caracteres después de los primeros tres dígitos: es bueno si es un corchete de cierre y un espacio después de él, pero es malo si hay dos guiones. Por lo tanto, hay una solución un poco más precisa: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"


Solución de análisis
  • "\ (?" - indicamos la posibilidad de la presencia del símbolo "(" o su ausencia, lo protegemos ya que es un símbolo reservado.
  • "\ d {3}": dígitos con una restricción de solo 3.
  • Son posibles otros caracteres "[\). \ / -] {1,2}": barra, paréntesis de cierre, punto, espacio, barra invertida y guión. {1,2}: dice que estos caracteres pueden ser 1 o 2. Por ejemplo, el corchete de cierre y el espacio después de él.
  • Además necesariamente "[-.]" - un guión o punto.
  • Y "\ d {4}" son los cuatro dígitos al final.

Tarea 10 - Autores


Hay un cierto patrón que contiene elementos, busque todos los autores en el campo de autor.


Dificultad: muy difícil.


Pista

Es necesario confiar en el hecho de que todos los nombres de los autores comienzan con una letra mayúscula y están escritos en un patrón.


Solución
[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?

Esta solución es correcta, pero tiene un signo menos. ¿Caminamos alrededor de "{\" u} con una "muleta" ({\ "\ w})?" y básicamente es viable si también pones esta muleta en otras partes de los nombres de los autores.


En cualquier caso, si pudiste resolver de alguna manera este problema, ¡es genial!


Solución de análisis
  • "[AZ] [A-Za-z - '] +" - Estamos buscando una palabra que necesariamente comience con una letra mayúscula, luego contenga cualquier carácter alfabético, guión o apóstrofe.
  • Además, ¿todo es exactamente igual a un poco más alto, pero aquí tenemos "({\" \ w})? "- es solo una muleta que le permite evitar el blindaje. Esto significa que puede estar presente una pieza de" {\ "u}" estar ausente
  • Y, de nuevo, exactamente lo mismo que en el primer caso "([AZ] [A-Za-z - '] *)?", El aviso es con la excepción de que esta expresión está envuelta en un grupo y hay un "?" es decir, no vinculante esta condición.

La enumeración de PS [A-Za-z] aquí es una medida necesaria, porque no hay modificadores en la prueba.


Mejor solucion

Hay una solución más compacta y simple que le permite abandonar la muleta de arriba:


[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B

Solución de análisis
  • "[AZ] \ S +," - primero, necesariamente, la letra mayúscula "[AZ]", luego cualquier número de caracteres que no sean espacios en blanco "\ S +" hasta el punto y coma ",".
  • Además, casi el mismo "[AZ] \ S *": el comienzo es necesariamente con una letra mayúscula y luego cualquier carácter que no sea un espacio en blanco al borde de la palabra "\ b".
  • "([AZ] [\ S] *)?" - y entre ellos el mismo grupo, pero no obligatorio para un segundo nombre.

Tarea 11 - Contenido del encabezado


Al igual que en la tarea 8, pero necesita encontrar no los encabezados, sino sus contenidos.


Dificultad: difícil.


Pista

La tarea es idéntica a la tarea 8. No es difícil si sabes acerca de mirar hacia adelante y hacia atrás. Tiene una solución con mirar hacia atrás y sin mirar hacia atrás.


Solución

Sin mirar atrás:


([\ w] * <[^ h]. + | [^ <>] +) (? = <\ / h \ d>)

Solución de análisis
  • "([\ w] * <[^ h]. + | [^ <>] +)": hay dos opciones de cómo puede comenzar el contenido del encabezado. El primero es con la etiqueta dentro de "[\ w] * <[^ h]. +" - al mismo tiempo, debe asegurarse de que no sea la etiqueta h y tener en cuenta que puede haber texto antes de la etiqueta. La segunda opción es el texto sin etiquetas "[^ <>] +", es decir, cualquier otro carácter que no sea abrir y cerrar la etiqueta.
  • "(? = <\ / h \ d>)" - mirando hacia adelante, dentro del cual debe haber una etiqueta de cierre h.

Mirando hacia atrás


(? <= <h [^>] +>). +? (? = <\ / h \ d>)

Además, puede tener en cuenta todos los comentarios sobre la solución 8 del problema.


Solución de análisis
  • "(? <= <h [^>] +>)" - mirando dentro de la cual debería haber una etiqueta h.
  • "(? = <\ / h \ d>)" - mirando hacia adelante, dentro del cual debe haber una etiqueta de cierre h.

Tarea 12 - Lista de autores


La tarea es similar a la décima tarea, pero en mi opinión es más fácil.


Dificultad: difícil.


Pista

Todos los principios básicos de las 10 tareas, pero debe considerar el comienzo de la línea. La solución que conozco es mirar hacia atrás.


Solución
(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +

Solución de análisis
  • "(? <= ^ \ d +.)" - mirando hacia atrás donde debe tener cualquier número de dígitos hasta el punto con un espacio desde una nueva línea.
  • "[AZ] [\ w] +," - además de cualquier palabra de una letra mayúscula a un punto y coma y una vez más el mismo "[AZ] [\ w.] +".

O simplemente, esto:


(? <= ^ \ d + \.) [^,] +, [^,:] +

Solución de análisis
  • "(? <= ^ \ d +.)" - mirando hacia atrás donde debe tener cualquier número de dígitos hasta el punto con un espacio desde una nueva línea.
  • "[^,] +," - cualquier número de caracteres a la coma + coma.
  • "[^,:] +": cualquier número de caracteres antes de la coma o los dos puntos.

Source: https://habr.com/ru/post/472110/


All Articles