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())
<_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.
- 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.
- 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'))
['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'))
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'))
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'))
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'))
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)
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'))
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'))
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'))
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'))
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'))
<_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'))
<_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)
<_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())
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())
('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))
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'))
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())
{'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'))
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'))
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'))
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