Tutorial de expresiones regulares de Python | Tutorial de Python Regex

Contenidos

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.

aprender expresiones regulares en python

¡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é:

  1. revancha()
  2. investigar()
  3. re.findall ()
  4. re.split ()
  5. re.sub ()
  6. 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.

OperadoresDescripció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

y

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.

Si le gusta lo que acaba de leer y desea continuar con su aprendizaje sobre análisis, suscríbete a nuestros correos electrónicos, Síguenos en Twitter o como nuestro pagina de Facebook.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.