Relevancia de las expresiones regulares
En los últimos años, ha habido un cambio dramático en el uso de lenguajes de programación de propósito general para ciencia de datos y aprendizaje automático. Este no fue siempre el caso: hace una década, ¡este pensamiento habría encontrado muchos ojos escépticos!
Esto significa que más personas / instituciones están usando herramientas como Python / JavaScript para solucionar sus necesidades de datos. Aquí es donde las expresiones regulares se vuelven súper útiles. Las expresiones regulares son regularmente la forma predeterminada de limpieza y disputa de datos en la mayoría de estas herramientas. Ya sea la extracción de partes específicas de texto de páginas web, dar sentido a los datos de Twitter o preparar sus datos para la minería de texto, las expresiones regulares son su mejor opción para todas estas tareas.
Dada su aplicabilidad, tiene sentido conocerlos y usarlos adecuadamente.
¿Qué aprenderá de este post?
En este post, lo guiaré a través del uso, ejemplos y aplicaciones de las expresiones regulares. Las expresiones regulares son muy populares entre los programadores y se pueden aplicar en muchos lenguajes de programación como Java, JS, php, C ++, etc. Para desarrollar nuestra comprensión, hemos explicado este concepto usando el lenguaje de programación Python. Hacia el final, resolví varios problemas usando expresiones regulares.
¡Comencemos!
¿Qué es la expresión regular y cómo se utiliza?
Resumidamente, la expresión regular es una secuencia de caracteres que se usan principalmente para buscar y reemplazar patrones en una cadena o archivo. Como mencioné antes, son compatibles con la mayoría de los lenguajes de programación como python, perl, R, Java y muchos otros. Entonces, aprenderlos ayuda de múltiples maneras (más sobre esto más adelante).
Las expresiones regulares usan dos tipos de caracteres:
a) Metacaracteres: como sugiere el nombre, estos caracteres disponen un significado especial, equivalente a * en el comodín.
b) Literales (como a, b, 1,2…)
En Python, tenemos el módulo «re”Que ayuda con las expresiones regulares. Entonces necesitas importar la biblioteca re antes de poder utilizar expresiones regulares en Python.
Use this code --> Import re
Los usos más comunes de las expresiones regulares son:
- Buscar una cadena (buscar y hacer coincidir)
- Hallar una cuerda (findall)
- Romper la cadena en una subcadena (dividir)
- Reemplazar parte de una cadena (sub)
Veamos los métodos que la biblioteca «re”Proporciona para realizar estas tareas.
Nota: Además tenemos un curso de video sobre el procesamiento del lenguaje natural que cubre además las expresiones regulares. ¡Compruébalo!
¿Cuáles son los distintos métodos de expresiones regulares?
El paquete ‘re’ proporciona varios métodos para realizar consultas en una cadena de entrada. Aquí están los métodos más utilizados, discutiré:
- revancha()
- investigar()
- re.findall ()
- re.split ()
- re.sub ()
- re.compile ()
Veámoslos uno por uno.
revancha(patrón, cuerda):
Este método encuentra una coincidencia si ocurre al comienzo de la cadena. A modo de ejemplo, llamar a match () en la cadena ‘AV Analytics AV’ y buscar un patrón ‘AV’ coincidirá. A pesar de esto, si solo buscamos Analytics, el patrón no coincidirá. Realicémoslo en Python ahora.
Aquí hay una ventana de codificación en vivo para comenzar. Puede ejecutar los códigos y obtener el resultado en esta ventana:
Arriba puede ver la posición inicial y final del patrón coincidente ‘AV’ en la cuerda y, en ocasiones, ayuda mucho al realizar la manipulación con la cuerda.
investigar(patrón, cuerda):
Es equivalente a match () pero no nos limita a buscar coincidencias solo al principio de la cadena. A diferencia del método anterior, aquí la búsqueda del patrón ‘Analytics’ devolverá una coincidencia.
Código
result = re.search(r'Analytics', 'AV DataPeaker AV') print result.group(0) Output: Analytics
Aquí puede ver que el método search () puede hallar un patrón desde cualquier posición de la cadena, pero solo devuelve la primera aparición del patrón de búsqueda.
re.findallpatrón, cuerda):
Eso ayuda a obtener una lista de todos los patrones coincidentes. No tiene restricciones de búsqueda desde el principio o el final. Si usamos el método findall para buscar ‘AV’ en una cadena dada, devolverá ambas ocurrencias de AV. Mientras busca una cadena, le recomendaría que utilice re.findall () siempre, puede funcionar como re.search () y re.match () ambos.
Código
result = re.findall(r'AV', 'AV DataPeaker AV') print result Output: ['AV', 'AV']
re.splitpatrón, cuerda, [maxsplit=0]):
Este método ayuda a dividir cuerda por las ocurrencias de dado patrón.
Código
result=re.split(r'y','Analytics') result Output: ['Anal', 'tics']
Arriba, hemos dividido la cadena «Analytics» por «y». El método split () tiene otro argumento «maxsplit“. Tiene un valor predeterminado de cero. En esta circunstancia hace las divisiones máximas que se pueden hacer, pero si le damos valor a maxsplit, dividirá la cadena. Veamos el siguiente ejemplo:
Código
result=re.split(r'i','DataPeaker') print result Output: ['Analyt', 'cs V', 'dhya'] #It has performed all the splits that can be done by pattern "i". Code result=re.split(r'i','DataPeaker',maxsplit=1) result Output: ['Analyt', 'cs Vidhya']
Aquí, puede observar que hemos fijado maxsplit en 1. Y el resultado es que solo tiene dos valores, mientras que el primer ejemplo tiene tres valores.
re.subpatrón, responder, cuerda):
Ayuda a buscar un patrón y reemplazarlo con una nueva subcadena. Si no se encuentra el patrón, cuerda se devuelve sin cambios.
Código
result=re.sub(r'India','the World','AV is largest Analytics community of India') result Output: 'AV is largest Analytics community of the World'
re.compilepatrón, responder, cuerda):
Podemos combinar un patrón de expresión regular en objetos de patrón, que se pueden utilizar para hacer coincidir patrones. Además es útil volver a buscar un patrón sin volver a escribirlo.
Código
import re pattern=re.compile('AV') result=pattern.findall('AV DataPeaker AV') print result result2=pattern.findall('AV is largest analytics community of India') print result2 Output: ['AV', 'AV'] ['AV']
Resumen rápido de varios métodos:
Hasta el momento, analizamos varios métodos de expresión regular usando un patrón constante (caracteres fijos). Pero, ¿qué pasa si no tenemos un patrón de búsqueda constante y queremos devolver un conjunto específico de caracteres (definido por una regla) de una cadena? No se deje intimidar.
Esto se puede solucionar fácilmente definiendo una expresión con la ayuda de operadores de patrón (caracteres meta y literales). Veamos los operadores de patrones más comunes.
¿Cuáles son los operadores más utilizados?
Las expresiones regulares pueden especificar patrones, no solo caracteres fijos. Estos son los operadores más utilizados que ayudan a generar una expresión para representar los caracteres requeridos en una cadena o archivo. Se utiliza comúnmente en el desguace web y la minería de texto para extraer la información requerida.
Operadores | Descripción |
. | Coincide con cualquier carácter único excepto la nueva línea ‘ n’. |
? | coincidir con 0 o 1 aparición del patrón a su izquierda |
+ | 1 o más ocurrencias del patrón a su izquierda |
* | 0 o más apariciones del patrón a su izquierda |
w | Coincide con un carácter alfanumérico mientras que W (W mayúscula) coincide con un carácter no alfanumérico. |
D | Coincidencias con dígitos [0-9] y / D (D mayúscula) coincide con no dígitos. |
s | Coincide con un solo carácter de espacio en blanco (espacio, nueva línea, retorno, tabulación, formulario) y S (S mayúscula) coincide con cualquier carácter que no sea de espacio en blanco. |
B | límite entre palabra y no palabra y / B es opuesto a / b |
[..] | Coincide con cualquier carácter individual en un corchete y [^..] coincide con cualquier carácter individual que no esté entre corchetes |
Se utiliza para caracteres de significado especial como . para coincidir con un punto o + para el signo más. | |
^ y $ | ^ y $ coinciden con el inicio o el final de la cadena respectivamente |
{Nuevo Méjico} | Coincide con al menos n y como máximo m apariciones de la expresión precedente si la escribimos como {, m} entonces devolverá al menos cualquier ocurrencia mínima al máximo m expresión precedente. |
a | B | Coincide con a o b |
() | Agrupa expresiones regulares y devuelve texto coincidente |
t, n, r | Pestaña Coincidencias, nueva línea, retorno |
Para obtener más detalles sobre los metacaracteres «(«, «)», «|» y otros detalles, puede consultar este link (https://docs.python.org/2/library/re.html).
Ahora, entendamos los operadores de patrones observando los siguientes ejemplos.
Algunos ejemplos de expresiones regulares
Problema 1: Devuelve la primera palabra de una cadena dada
Solución-1 Extrae cada personaje (usando « w«)
Código
import re result=re.findall(r'.','AV is largest Analytics community of India') print result Output: ['A', 'V', ' ', 'i', 's', ' ', 'l', 'a', 'r', 'g', 'e', 's', 't', ' ', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', ' ', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', ' ', 'o', 'f', ' ', 'I', 'n', 'd', 'i', 'a']
Arriba además se extrae espacio, ahora para evitar que se use « w» en lugar de «.“.
Código
result=re.findall(r'w','AV is largest Analytics community of India') print result Output: ['A', 'V', 'i', 's', 'l', 'a', 'r', 'g', 'e', 's', 't', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', 'o', 'f', 'I', 'n', 'd', 'i', 'a']
Solución-2 Extrae cada palabra (usando «*» o «+«)
Código
result=re.findall(r'w*','AV is largest Analytics community of India') print result Output: ['AV', '', 'is', '', 'largest', '', 'Analytics', '', 'community', '', 'of', '', 'India', '']
Una vez más, está devolviendo el espacio como palabra debido a que «*”Devuelve cero o más coincidencias de patrón a su izquierda. Ahora, para borrar los espacios, iremos con «+“.
Código
result=re.findall(r'w+','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']
Solución-3 Extrae cada palabra (usando «^«)
Código
result=re.findall(r'^w+','AV is largest Analytics community of India') print result Output: ['AV']
Si usamos “$” en lugar de “^”, devolverá la palabra del final de la cadena. Veámoslo.
Código
result=re.findall(r'w+$','AV is largest Analytics community of India') print result
Output:
[‘India’]
Problema 2: Devuelve los dos primeros caracteres de cada palabra
Solución-1 Extraiga dos caracteres consecutivos de cada palabra, excluidos los espacios (usando « w«)
Código
result=re.findall(r'ww','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'la', 'rg', 'es', 'An', 'al', 'yt', 'ic', 'co', 'mm', 'un', 'it', 'of', 'In', 'di']
Solución-2 Extraiga dos caracteres consecutivos los disponibles al comienzo del límite de la palabra (usando «B«)
result=re.findall(r'bw.','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'la', 'An', 'co', 'of', 'In']
Problema 3: Devuelve el tipo de dominio de los ID de email dados
Para explicarlo de manera simple, volveré a ir con un enfoque paso a paso:
Solución-1 Extrae todos los caracteres después de «@»
Código
result=re.findall(r'@w+','[email protected], [email protected], [email protected], [email protected]') print result Output: ['@gmail', '@test', '@analyticsvidhya', '@rest']
Arriba, puede ver que la parte «.com», «.in» no se extrae. Para agregarlo, iremos con el siguiente código.
result=re.findall(r'@w+.w+','[email protected], [email protected], [email protected], [email protected]') print result Output: ['@gmail.com', '@test.in', '@analyticsvidhya.com', '@rest.biz']
Solución – 2 Extraiga solo el nombre de dominio usando «()»
Código
result=re.findall(r'@w+.(w+)','[email protected], [email protected], [email protected], [email protected]') print result
Output: ['com', 'in', 'com', 'biz']
Problema 4: fecha de retorno de la cadena dada
Aquí usaremos «D”Para extraer el dígito.
Solución:
Código
result=re.findall(r'd{2}-d{2}-d{4}','Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') print result Output: ['12-05-2007', '11-11-2011', '12-01-2009']
Si desea extraer sólo un año, el paréntesis “()” le ayudará.
Código
result=re.findall(r'd{2}-d{2}-(d{4})','Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') print result Output: ['2007', '2011', '2009']
Problema 5: Devuelve todas las palabras de una cadena que comienzan con vocal
Solución-1 Devuelve cada palabra
Código
result=re.findall(r'w+','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']
Solución-2 Las palabras de retorno comienzan con alfabetos (usando [])
Código
result=re.findall(r'[aeiouAEIOU]w+','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'argest', 'Analytics', 'ommunity', 'of', 'India']
Arriba puede ver que ha devuelto «argest» y «ommunity» desde la mitad de las palabras. Para borrar estos dos, necesitamos utilizar » b» para el límite de la palabra.
Solución 3
Código
result=re.findall(r'b[aeiouAEIOU]w+','AV is largest Analytics community of India') print result Output: ['AV', 'is', 'Analytics', 'of', 'India']
De manera equivalente, podemos extraer palabras que comienzan con constante usando “^” entre corchetes.
Código
result=re.findall(r'b[^aeiouAEIOU]w+','AV is largest Analytics community of India') print result Output: [' is', ' largest', ' Analytics', ' community', ' of', ' India']
Arriba puede ver que ha devuelto palabras que comienzan con espacio. Para eliminarlo de la salida, incluya un espacio entre corchetes[].
Código
result=re.findall(r'b[^aeiouAEIOU ]w+','AV is largest Analytics community of India') print result Output: ['largest', 'community']
Problema 6: validar un número de teléfono (el número de teléfono debe tener 10 dígitos y comenzar con 8 o 9)
Tenemos una lista de números de teléfono en el listado «li» y aquí validaremos los números de teléfono usando
Solución
Código
import re li=['9999999999','999999-999','99999x9999'] for val in li: if re.match(r'[8-9]{1}[0-9]{9}',val) and len(val) == 10: print 'yes' else: print 'no'
Output: yes no no
Problema 7: dividir una cadena con muchos delimitadores
Solución
Código
import re line = 'asdf fjdk;afed,fjek,asdf,foo' # String has multiple delimiters (";",","," "). result= re.split(r'[;,s]', line) print result Output: ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
Además podemos utilizar el método re.sub () para reemplazar estos delimitadores múltiples con uno como espacio ”“.
Código
import re line = 'asdf fjdk;afed,fjek,asdf,foo' result= re.sub(r'[;,s]',' ', line) print result Output: asdf fjdk afed fjek asdf foo
Problema 8: recuperar información de un archivo HTML
Quiero extraer información de un archivo HTML (vea los datos de muestra a continuación). Aquí necesitamos extraer la información disponible entre
excepto el primer índice numérico. He asumido aquí que el código html a continuación se almacena en una cadena str.
Ejemplo de archivo HTML (str)
<tr align="center"><td>1</td> <td>Noah</td> <td>Emma</td></tr> <tr align="center"><td>2</td> <td>Liam</td> <td>Olivia</td></tr> <tr align="center"><td>3</td> <td>Mason</td> <td>Sophia</td></tr> <tr align="center"><td>4</td> <td>Jacob</td> <td>Isabella</td></tr> <tr align="center"><td>5</td> <td>William</td> <td>Ava</td></tr> <tr align="center"><td>6</td> <td>Ethan</td> <td>Mia</td></tr> <tr align="center"><td>7</td> <td HTML>Michael</td> <td>Emily</td></tr>
Solución:
Código
result=re.findall(r'<td>w+</td>s<td>(w+)</td>s<td>(w+)</td>',str) print result Output: [('Noah', 'Emma'), ('Liam', 'Olivia'), ('Mason', 'Sophia'), ('Jacob', 'Isabella'), ('William', 'Ava'), ('Ethan', 'Mia'), ('Michael', 'Emily')]
Puede leer el archivo html usando la biblioteca urllib2 (vea el código a continuación).
Código
import urllib2 response = urllib2.urlopen('') html = response.read()
Notas finales
En este post, discutimos sobre la expresión regular, los métodos y los metacaracteres para formar una expresión regular. Además hemos analizado varios ejemplos para ver los usos prácticos de la misma. Aquí he tratado de presentarles las expresiones regulares y cubrir los métodos más comunes para solucionar el máximo de problemas de expresiones regulares.
¿Le fue útil el post? Háganos saber su opinión sobre esta guía en la sección de comentarios a continuación.