Javascript
Regular Expression
Python
Regular Expressions
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*/
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;
Tomando la expresion que utilizamos en el ejemplo dado, /^((?!English).)*$/gm;
vamos a analizar que es lo que está sucediendo
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.
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*/
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