Python expresión regular

En este tutorial, aprenderá sobre RegEx y comprenderá varias expresiones regulares.

  • Expresiones regulares
  • Por qué expresiones regulares
  • Expresiones regulares básicas
  • Más expresiones regulares
  • Expresiones regulares compiladas

Un RegEx es una poderosa herramienta para hacer coincidir el texto, basado en un patrón predefinido. Puede detectar la presencia o ausencia de un texto comparándolo con un patrón particular y también puede dividir un patrón en uno o más subpatrones. La biblioteca estándar de Python proporciona un módulo re para expresiones regulares. Su función principal es ofrecer una búsqueda, donde toma una expresión regular y una string. Aquí, devuelve la primera coincidencia o ninguna.

Python3

import re
  
  
match = re.search(r'portal', 'GeeksforGeeks: A computer science \
                  portal for geeks')
print(match)
print(match.group())
  
print('Start Index:', match.start())
print('End Index:', match.end())
Producción

<_sre.SRE_Match object; span=(52, 58), match='portal'>
portal
Start Index: 52
End Index: 58

Aquí el carácter r (r’portal’) significa raw, no RegEx. La string sin formato es ligeramente diferente de una string normal, no interpretará el carácter \ como un carácter de escape. Esto se debe a que el motor de expresiones regulares usa el carácter \ para su propio propósito de escape.

Antes de comenzar con el módulo de expresiones regulares de Python, veamos cómo escribir RegEx usando metacaracteres o secuencias especiales. 

metacaracteres

Para comprender la analogía de RE, los metacaracteres son útiles, importantes y se utilizarán en las funciones del módulo re. A continuación se muestra la lista de metacaracteres.

metacaracteres Descripción
\ Se utiliza para descartar el significado especial del carácter que lo sigue.
[] Representar una clase de personaje
^ Coincide con el principio
ps Coincide con el final
. Coincide con cualquier carácter excepto nueva línea
| Significa OR (Coincide con cualquiera de los caracteres separados por él.
? Coincide con cero o una ocurrencia
* Cualquier número de ocurrencias (incluyendo 0 ocurrencias)
+ Una o más ocurrencias
{} Indique el número de ocurrencias de un RegEx anterior para que coincida.
() Encerrar un grupo de RegEx

El método de grupo devuelve la string coincidente y el método de inicio y finalización proporciona el índice de string inicial y final. Aparte de esto, tiene muchos otros métodos, que discutiremos más adelante.

¿Por qué RegEx?

Tomemos un momento para comprender por qué debemos usar la expresión regular.

  1. Minería de datos : la expresión regular es la mejor herramienta para la minería de datos. Identifica eficientemente un texto en un montón de texto al verificar con un patrón predefinido. Algunos escenarios comunes son identificar un correo electrónico, URL o teléfono de una pila de texto.
  2. Validación de datos : la expresión regular puede validar perfectamente los datos. Puede incluir una amplia gama de procesos de validación definiendo diferentes conjuntos de patrones. Algunos ejemplos son la validación de números de teléfono, correos electrónicos, etc.

RegEx básico

Comprendamos algunas de las expresiones regulares básicas. Son los siguientes:

  • Clases de personajes
  • guardabosques
  • Negación
  • Atajos
  • Principio y final de la string
  • Cualquier personaje

Clases de personajes

Las clases de caracteres le permiten hacer coincidir un solo conjunto de caracteres con un posible conjunto de caracteres. Puede mencionar una clase de carácter dentro de los corchetes. Consideremos un ejemplo de palabras sensibles a mayúsculas y minúsculas. 

Python3

import re
  
  
print(re.findall(r'[Gg]eeks', 'GeeksforGeeks: \
                 A computer science portal for geeks'))
Producción

['Geeks', 'Geeks', 'geeks']

Rangos

El rango brinda la flexibilidad de hacer coincidir un texto con la ayuda de un patrón de rango, como un rango de números (0 a 9), un rango de caracteres (A a Z), etc. El carácter de guión dentro de la clase de carácter representa un rango.

Python3

import re
  
  
print('Range',re.search(r'[a-zA-Z]', 'x'))
Producción

Range <_sre.SRE_Match object; span=(0, 1), match='x'>

Negación

La negación invierte una clase de carácter. Buscará una coincidencia excepto el carácter invertido o el rango de caracteres invertidos mencionados en la clase de carácter.

Python3

import re
  
print(re.search(r'[^a-z]', 'c'))
Producción

None

En el caso anterior, hemos invertido la clase de caracteres que va de la a a la z. Si intentamos hacer coincidir un carácter dentro del rango mencionado, el motor de expresiones regulares devuelve Ninguno.

Consideremos otro ejemplo

Python3

import re
  
print(re.search(r'G[^e]', 'Geeks'))
Producción

None

Aquí acepta cualquier otro carácter que sigue a G, que no sea e.

Lista de secuencias especiales 

Secuencia especial Descripción Ejemplos
\A Coincide si la string comienza con el carácter dado \Afor  para frikis
por el mundo
\b Coincide si la palabra comienza o termina con el carácter dado. \b(string) buscará el comienzo de la palabra y (string)\b buscará el final de la palabra. \bge frikis
obtener
\B Es lo contrario de \b, es decir, la string no debe comenzar ni terminar con la expresión regular dada. \Bge juntos
fragua
\d Coincide con cualquier dígito decimal, esto es equivalente a la clase establecida [0-9] \d 123
gee1
\D Coincide con cualquier carácter que no sea un dígito, esto es equivalente a la clase establecida [^0-9] \D frikis
friki1
\s Coincide con cualquier carácter de espacio en blanco. \s caramba ks
un bc un
\S Coincide con cualquier carácter que no sea un espacio en blanco \S un bd
a B C D
\w Coincide con cualquier carácter alfanumérico, esto es equivalente a la clase [a-zA-Z0-9_]. \w 123
frikis4
\W Coincide con cualquier carácter no alfanumérico. \W >$
caramba <>
\Z Coincide si la string termina con la expresión regular dada ab\Z abcdab
abababab

Atajos

Analicemos algunos de los atajos proporcionados por el motor de expresiones regulares.

  • \w – coincide con un carácter de palabra
  • \d: coincide con el carácter de dígito
  • \s: coincide con el carácter de espacio en blanco (espacio, tabulador, nueva línea, etc.)
  • \b: coincide con un carácter de longitud cero

Python3

import re
  
  
print('Geeks:', re.search(r'\bGeeks\b', 'Geeks'))
print('GeeksforGeeks:', re.search(r'\bGeeks\b', 'GeeksforGeeks'))
Producción

Geeks: <_sre.SRE_Match object; span=(0, 5), match='Geeks'>
GeeksforGeeks: None

Principio y final de la string

El carácter ^ elige el comienzo de una string y el carácter $elige el final de una string.

Python3

import re
  
  
# Beginning of String
match = re.search(r'^Geek', 'Campus Geek of the month')
print('Beg. of String:', match)
  
match = re.search(r'^Geek', 'Geek of the month')
print('Beg. of String:', match)
  
# End of String
match = re.search(r'Geeks$', 'Compute science portal-GeeksforGeeks')
print('End of String:', match)
Producción

Beg. of String: None
Beg. of String: <_sre.SRE_Match object; span=(0, 4), match='Geek'>
End of String: <_sre.SRE_Match object; span=(31, 36), match='Geeks'>

Cualquier personaje

Los . El carácter representa cualquier carácter individual fuera de una clase de caracteres entre paréntesis.

Python3

import re
  
print('Any Character', re.search(r'p.th.n', 'python 3'))
Producción

Any Character <_sre.SRE_Match object; span=(0, 6), match='python'>

Más expresiones regulares

Algunas de las otras expresiones regulares son las siguientes:

  • Caracteres opcionales
  • Repetición
  • Taquigrafía
  • Agrupamiento
  • Mirar hacia el futuro
  • Sustitución

Caracteres opcionales

El motor de expresiones regulares le permite especificar caracteres opcionales usando el ? personaje. Permite que un personaje o una clase de personaje se presente una vez o no se presente. Consideremos el ejemplo de una palabra con una ortografía alternativa: color o color.

Python3

import re
  
  
print('Color',re.search(r'colou?r', 'color')) 
print('Colour',re.search(r'colou?r', 'colour'))
Producción

Color <_sre.SRE_Match object; span=(0, 5), match='color'>
Colour <_sre.SRE_Match object; span=(0, 6), match='colour'>

Repetición

La repetición le permite repetir el mismo personaje o clase de personaje. Considere un ejemplo de una fecha que consta de día, mes y año. Usemos una expresión regular para identificar la fecha (mm-dd-aaaa).

Python3

import re
  
  
print('Date{mm-dd-yyyy}:', re.search(r'[\d]{2}-[\d]{2}-[\d]{4}',
                                     '18-08-2020'))
Producción

Date{mm-dd-yyyy}: <_sre.SRE_Match object; span=(0, 10), match='18-08-2020'>

Aquí, el motor de expresiones regulares busca dos dígitos consecutivos. Al encontrar la coincidencia, se mueve al carácter de guión. Después de eso, verifica los siguientes dos dígitos consecutivos y se repite el proceso.  

Analicemos otras tres expresiones regulares bajo repetición.

Rangos de repetición

El rango de repetición es útil cuando tiene que aceptar uno o más formatos. Considere un escenario en el que se aceptan tanto tres como cuatro dígitos. Echemos un vistazo a la expresión regular.

Python3

import re
  
  
print('Three Digit:', re.search(r'[\d]{3,4}', '189'))
print('Four Digit:', re.search(r'[\d]{3,4}', '2145'))
Producción

Three Digit: <_sre.SRE_Match object; span=(0, 3), match='189'>
Four Digit: <_sre.SRE_Match object; span=(0, 4), match='2145'>

Rangos abiertos

Hay escenarios donde no hay límite para la repetición de un personaje. En tales escenarios, puede establecer el límite superior como infinitivo. Un ejemplo común es hacer coincidir direcciones de calles. Echemos un vistazo  

Python3

import re
  
  
print(re.search(r'[\d]{1,}','5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
Producción

<_sre.SRE_Match object; span=(0, 1), match='5'>

Taquigrafía

Los caracteres abreviados le permiten usar el carácter + para especificar uno o más ({1,}) y el carácter * para especificar cero o más ({0,}.

Python3

import re
  
print(re.search(r'[\d]+', '5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
Producción

<_sre.SRE_Match object; span=(0, 1), match='5'>

Agrupamiento

La agrupación es el proceso de separar una expresión en grupos mediante el uso de paréntesis y le permite obtener cada grupo coincidente individual.  

Python3

import re
  
  
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})', '26-08-2020')
print(grp)
Producción

<_sre.SRE_Match object; span=(0, 10), match='26-08-2020'>

Veamos algunas de sus funciones.

Devolver el partido completo

El módulo re te permite devolver el partido completo usando el método group()

Python3

import re
  
  
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group())
Producción

26-08-2020

Devuelve una tupla de grupos coincidentes

Puede usar el método groups() para devolver una tupla que contenga grupos coincidentes individuales

Python3

import re
  
  
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.groups())
Producción

('26', '08', '2020')

Recuperar un solo grupo

Al pasar el índice a un método de grupo, puede recuperar solo un grupo.

Python3

import re
  
  
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group(3))
Producción

2020

Nombra tus grupos

El módulo re le permite nombrar sus grupos. Veamos la sintaxis.

Python3

import re
  
  
match = re.search(r'(?P<dd>[\d]{2})-(?P<mm>[\d]{2})-(?P<yyyy>[\d]{4})',
                  '26-08-2020')
print(match.group('mm'))
Producción

08

Coincidencia individual como diccionario

Hemos visto cómo la expresión regular proporciona una tupla de grupos individuales. No solo tupla, sino que también puede proporcionar coincidencias individuales como un diccionario en el que el nombre de cada grupo actúa como la clave del diccionario.

Python3

import re
  
  
match = re.search(r'(?P<dd>[\d]{2})-(?P<mm>[\d]{2})-(?P<yyyy>[\d]{4})',
                  '26-08-2020')
print(match.groupdict())
Producción

{'dd': '26', 'mm': '08', 'yyyy': '2020'}

Mirar hacia el futuro

En el caso de una clase de carácter negado, no coincidirá si un carácter no está presente para compararlo con el carácter negado. Podemos superar este caso usando lookahead; acepta o rechaza una coincidencia en función de la presencia o ausencia de contenido.  

Python3

import re
  
  
print('negation:', re.search(r'n[^e]', 'Python'))
print('lookahead:', re.search(r'n(?!e)', 'Python'))
Producción

negation: None
lookahead: <_sre.SRE_Match object; span=(5, 6), match='n'>

Lookahead también puede descalificar la coincidencia si no va seguida de un carácter en particular. Este proceso se denomina anticipación positiva y puede lograrse simplemente reemplazando ! carácter con = carácter .

Python3

import re
  
print('positive lookahead', re.search(r'n(?=e)', 'jasmine'))
Producción

positive lookahead <_sre.SRE_Match object; span=(5, 6), match='n'>

Sustitución

La expresión regular puede reemplazar la string y devuelve la reemplazada usando el método re.sub. Es útil cuando desea evitar caracteres como /, -, ., etc. antes de almacenarlo en una base de datos. Se necesitan tres argumentos:

  • la expresión regular
  • la string de reemplazo
  • la string de origen que se busca

Echemos un vistazo al siguiente código que reemplaza el carácter de un número de tarjeta de crédito.

Python3

import re
  
print(re.sub(r'([\d]{4})-([\d]{4})-([\d]{4})-([\d]{4})',r'\1\2\3\4',
             '1111-2222-3333-4444'))
Producción

1111222233334444

RegEx compilado

El motor de expresiones regulares de Python puede devolver un objeto de expresión regular compilado (RegEx) usando la función de compilación. Este objeto tiene su método de búsqueda y submétodo, donde un desarrollador puede reutilizarlo cuando lo necesite.  

Python3

import re
  
regex = re.compile(r'([\d]{2})-([\d]{2})-([\d]{4})')
  
# search method
print('compiled reg expr', regex.search('26-08-2020'))
  
# sub method
print(regex.sub(r'\1.\2.\3', '26-08-2020'))

Producción

registro compilado expr <_sre.SRE_Match objeto; intervalo=(0, 10), partido=’26-08-2020′> 26.08.2020

Resumen

RegEx es una poderosa herramienta para la minería y validación de datos. Sin embargo, evite usar expresiones regulares siempre que tenga una solución sencilla. Y también, cuando tenga que lidiar con estructuras complejas como un formato de documento no trivial, intente usar otras bibliotecas que satisfagan la necesidad.

Publicación traducida automáticamente

Artículo escrito por SonuGeorge y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *