4Geeks logo
4Geeks logo

Bootcamps

Explora nuestra extensa colección de cursos diseñados para ayudarte a dominar varios temas y habilidades. Ya seas un principiante o un aprendiz avanzado, aquí hay algo para todos.

Academia

Aprende en vivo

Únete a nosotros en nuestros talleres gratuitos, webinars y otros eventos para aprender más sobre nuestros programas y comenzar tu camino para convertirte en desarrollador.

Próximos eventos en vivo

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Full-Stack Software Developer - 16w

Data Science and Machine Learning - 16 wks

Buscar en lecciones


IngresarEmpezar

Weekly Coding Challenge

Todas las semanas escogemos un proyecto de la vida real para que construyas tu portafolio y te prepares para conseguir un trabajo. Todos nuestros proyectos están construidos con ChatGPT como co-pilot!

Únete al reto

Podcast: Code Sets You Free

Un podcast de cultura tecnológica donde aprenderás a luchar contra los enemigos que te bloquean en tu camino para convertirte en un profesional exitoso en tecnología.

Escuchar el podcast
← Volver a Cómo hacerlo
Editar en Github

RegEx para no match

Escrito por:

Debido a que regex no posee una función concreta para cuando no encuentra algo (pensemos que su finalidad es encontrar lo que le pedimos), haciendo uso de Negative Lookahead podemos hacer que nos devuelva cuando no realiza un match.

1const list = `English 101 Class A 2Spanish 101 Class D 3Italian 201 Class E 4English 201 Class B 5French 101 Class F 6`; 7 8const searchAllButEnglish = (listOfCourses) => { 9 const regex = /^((?!English).)*$/gm; 10 return listOfCourses.match(regex) 11} 12 13console.log(searchAllButEnglish(list)) 14 15/* expected Output: 16[ 17 'Spanish 101 Class D', 18 'Italian 201 Class E', 19 'French 101 Class F' 20] 21*/

Regex for No Match

Las expresiones regulares son extremadamente utiles a la hora de buscar la información que necesitamos dentro de un texto pero por la naturaleza y el fin para el cual fueron creadas, no constan con un mecanismo "per se" para hacer un match y retornarnos esa información cuando no encuentra algo.

Gracias a las funcionalidades que posee, sí podemos realizar un match para cuando NO se encuentra información. Como mencionamos anteriormente, es mediante el uso del Negative Lookahead usando la expresion /^((?!).)*$/gm;

Analizando la expresión

Tomando la expresion que utilizamos en el ejemplo dado, /^((?!English).)*$/gm; vamos a analizar que es lo que está sucediendo

  • /^ -> Le decimos que queremos que haga match desde la primera posición
  • ((?!).)
    • ( -> creamos un grupo (?!English) -> para hacer un Negative Lookahead (?!) del parametro (texto) que queremos que NO nos devuelva .) -> usamos el wildcar para que nos devuelva todo lo que encuentre se cumpla el Negative Lookahead y cerramos el grupo
  • *$ -> Le decimos que queremos que haga match en la última posición
  • /gm; -> le indicamos que será una búsqueda global con la g y multilínea con la m

Ahora que ya hemos revizado la expresión regular que hemos utilizado en el ejemplo, vamos a ver cómo nos funciona tanto cuando el texto que buscamos, en este caso 'English' se encuentra en diferentes posiciones y el resultado que nos arrojará nuestra función.

Javascript

1const list = `English 101 Class A 2301 English Class G 3Class H 302 English 4English 201 Class B 5Spanish 101 Class D 6Italian 201 Class E 7French 101 Class F 8`; 9 10const searchAllButEnglish = (listOfCourses) => { 11 const regex = /^((?!English).)*$/gm; 12 return listOfCourses.match(regex) 13} 14 15console.log(searchAllButEnglish(list)) 16 17/* expected Output: 18[ 19 'Spanish 101 Class D', 20 'Italian 201 Class E', 21 'French 101 Class F', 22 '' 23] 24*/

Python:

1import re 2 3test_str = ("English 101 Class A\n" 4 "English 201 Class B\n" 5 "Spanish 101 Class D\n" 6 "Italian 201 Class E\n" 7 "French 101 Class F\n") 8 9def searchAllButEnglish(text): 10 regex = r"^((?!English).)*$" 11 matches = re.finditer(regex, text, re.MULTILINE) 12 for match in matches: 13 print(match) 14 return match 15print(searchAllButEnglish(test_str)) 16 17# Exprected output: 18# <re.Match object; span=(40, 59), match='Spanish 101 Class D'> 19# <re.Match object; span=(60, 79), match='Italian 201 Class E'> 20# <re.Match object; span=(80, 98), match='French 101 Class F'> 21# <re.Match object; span=(99, 99), match=''> 22# <re.Match object; span=(99, 99), match=''> 23

Como se puede observar, aún pasandole lineas de textos donde 'English' se encuentra en diferentes posiciones, sigue devolviendonos solo los elementos que NO contiene el parámetro de búsqueda que hemos declarado con el Negative Lookahead. Este comportamiento se debe a la inclusión de los símbolos ^, $, ..

En Python recordar importar re, nuestro modulo de expresiones regulares.

Esperamos que haya sido útil este artículo, puedes leer más sobre este tema y muchos otros en el blog de 4Geeks