Expresión regular en Python con ejemplos | Serie 1

Una expresión regular (RegEx) es una secuencia especial de caracteres que utiliza un patrón de búsqueda para encontrar una string o un conjunto de strings. 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. Python proporciona un módulo re que admite el uso de expresiones regulares en Python. 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.

Ejemplo:

Python3

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

Start Index: 34
End Index: 40

El código anterior proporciona el índice inicial y el índice final del portal de strings. 

Nota: 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 expresiones regulares 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 una expresión regular anterior para que coincida.
() Encerrar un grupo de Regex

Analicemos cada uno de estos metacaracteres en detalle. 

\ – Barra invertida

La barra invertida (\) asegura que el carácter no sea tratado de manera especial. Esto puede considerarse una forma de escapar de los metacaracteres. Por ejemplo, si desea buscar el punto (.) en la string, encontrará que el punto (.) se tratará como un carácter especial como uno de los metacaracteres (como se muestra en la tabla anterior). Entonces, para este caso, usaremos la barra invertida (\) justo antes del punto (.) para que pierda su especialidad. Vea el siguiente ejemplo para una mejor comprensión.

Ejemplo: 

Python3

import re
 
s = 'geeks.forgeeks'
 
# without using \
match = re.search(r'.', s)
print(match)
 
# using \
match = re.search(r'\.', s)
print(match)
Producción

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

[] – Corchetes

Los corchetes ([]) representan una clase de caracteres que consta de un conjunto de caracteres que deseamos hacer coincidir. Por ejemplo, la clase de carácter [abc] coincidirá con cualquier a, b o c. 

También podemos especificar un rango de caracteres usando – dentro de los corchetes. Por ejemplo, 

  • [0, 3] es muestra como [0123]
  • [ac] es lo mismo que [abc]

También podemos invertir la clase de carácter usando el símbolo de intercalación (^). Por ejemplo, 

  • [^0-3] significa cualquier número excepto 0, 1, 2 o 3
  • [^ac] significa cualquier carácter excepto a, b o c

^ – Intercalación

El símbolo de intercalación (^) coincide con el comienzo de la string, es decir, comprueba si la string comienza con los caracteres dados o no. Por ejemplo –  

  • ^g verificará si la string comienza con g, como geeks, globe, girl, g, etc.
  • ^ge verificará si la string comienza con ge, como geeks, geeksforgeeks, etc.

$– dólar

El símbolo de dólar ($) coincide con el final de la string, es decir, comprueba si la string termina con los caracteres dados o no. Por ejemplo – 

  • s$buscará la string que termina con geeks, extremos, s, etc.
  • ks$buscará la string que termina con ks, como geeks, geeksforgeeks, ks, etc.

. – Punto

El símbolo de punto (.) coincide con un solo carácter excepto el carácter de nueva línea (\n). Por ejemplo –  

  • ab buscará la string que contiene cualquier carácter en el lugar del punto, como acb, acbd, abbb, etc.
  • .. comprobará si la string contiene al menos 2 caracteres

| – O

El símbolo or funciona como el operador or, lo que significa que verifica si el patrón antes o después del símbolo or está presente en la string o no. Por ejemplo –  

  • a|b coincidirá con cualquier string que contenga a o b, como acd, bcd, abcd, etc.

? – Signo de interrogación

El signo de interrogación (?) comprueba si la string antes del signo de interrogación en la expresión regular aparece al menos una vez o no aparece en absoluto. Por ejemplo –  

  • ab?c coincidirá con la string ac, acb, dabc pero no coincidirá con abbc porque hay dos b. De manera similar, no coincidirá con abdc porque b no va seguido de c.

* – Estrella

El símbolo de estrella (*) coincide con cero o más apariciones de la expresión regular que precede al símbolo *. Por ejemplo –  

  • ab*c coincidirá con la string ac, abc, abbbc, dabc, etc. pero no coincidirá con abdc porque b no va seguida de c.

+ – Más

El símbolo más (+) coincide con una o más apariciones de la expresión regular que precede al símbolo +. Por ejemplo –  

  • ab+c coincidirá con la string abc, abbc, dabc, pero no con ac, abdc porque no hay b en ac y b no va seguida de c en abdc.

{m, n} – Llaves

Las llaves coinciden con las repeticiones que preceden a la expresión regular de m a n, ambas inclusive. Por ejemplo –  

  • a{2, 4} coincidirá con la string aaab, baaaac, gaad, pero no coincidirá con strings como abc, bc porque solo hay una a o ninguna a en ambos casos.

(<regex>) – Grupo

El símbolo de grupo se utiliza para agrupar subpatrones. Por ejemplo –  

  • (a|b)cd coincidirá con strings como acd, abcd, gacd, etc.

Secuencias Especiales

Las secuencias especiales no coinciden con el carácter real en la string, sino que indican la ubicación específica en la string de búsqueda donde debe ocurrir la coincidencia. Facilita la escritura de patrones de uso común.  

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

Módulo Regex en Python

Python tiene un módulo llamado re que se usa para expresiones regulares en Python. Podemos importar este módulo usando la declaración de importación .

Ejemplo: Importación del módulo re en Python 

Python3

import re

Veamos varias funciones proporcionadas por este módulo para trabajar con expresiones regulares en Python. 

re.findall()

Devuelve todas las coincidencias no superpuestas del patrón en la string, como una lista de strings. La string se escanea de izquierda a derecha y las coincidencias se devuelven en el orden encontrado.

Ejemplo: encontrar todas las ocurrencias de un patrón 

Python3

# A Python program to demonstrate working of
# findall()
import re
 
# A sample text string where regular expression
# is searched.
string = """Hello my Number is 123456789 and
            my friend's number is 987654321"""
 
# A sample regular expression to find digits.
regex = '\d+'
 
match = re.findall(regex, string)
print(match)
 
# This example is contributed by Ayush Saluja.
Producción

['123456789', '987654321']

re.compilar() 

Las expresiones regulares se compilan en objetos de patrón, que tienen métodos para varias operaciones, como buscar coincidencias de patrones o realizar sustituciones de strings. 

Ejemplo 1:

Python

# Module Regular Expression is imported
# using __import__().
import re
 
# compile() creates regular expression
# character class [a-e],
# which is equivalent to [abcde].
# class [abcde] will match with string with
# 'a', 'b', 'c', 'd', 'e'.
p = re.compile('[a-e]')
 
# findall() searches for the Regular Expression
# and return a list upon finding
print(p.findall("Aye, said Mr. Gibenson Stark"))

Producción: 

['e', 'a', 'd', 'b', 'e', 'a']

Comprender la salida: 

  • La primera aparición es ‘e’ en «Aye» y no ‘A’, ya que distingue entre mayúsculas y minúsculas.
  • La siguiente aparición es ‘a’ en «dicho», luego ‘d’ en «dicho», seguida de ‘b’ y ‘e’ en «Gibenson», la última ‘a’ coincide con «Stark».
  • La barra invertida del metacarácter ‘\’ tiene un papel muy importante ya que señala varias secuencias. Si la barra invertida se va a usar sin su significado especial como metacarácter, use ‘\\’

Ejemplo 2: Establecer clase [\s,.] coincidirá con cualquier carácter de espacio en blanco, ‘,’ o ‘.’ . 

Python

import re
 
# \d is equivalent to [0-9].
p = re.compile('\d')
print(p.findall("I went to him at 11 A.M. on 4th July 1886"))
 
# \d+ will match a group on [0-9], group
# of one or greater size
p = re.compile('\d+')
print(p.findall("I went to him at 11 A.M. on 4th July 1886"))

Producción: 

['1', '1', '4', '1', '8', '8', '6']
['11', '4', '1886']

Ejemplo 3:

Python

import re
 
# \w is equivalent to [a-zA-Z0-9_].
p = re.compile('\w')
print(p.findall("He said * in some_lang."))
 
# \w+ matches to group of alphanumeric character.
p = re.compile('\w+')
print(p.findall("I went to him at 11 A.M., he \
said *** in some_language."))
 
# \W matches to non alphanumeric characters.
p = re.compile('\W')
print(p.findall("he said *** in some_language."))

Producción: 

['H', 'e', 's', 'a', 'i', 'd', 'i', 'n', 's', 'o', 'm', 'e', '_', 'l', 'a', 'n', 'g']
['I', 'went', 'to', 'him', 'at', '11', 'A', 'M', 'he', 'said', 'in', 'some_language']
[' ', ' ', '*', '*', '*', ' ', ' ', '.']

Ejemplo 4:

Python

import re
 
# '*' replaces the no. of occurrence
# of a character.
p = re.compile('ab*')
print(p.findall("ababbaabbb"))

Producción: 

['ab', 'abb', 'a', 'abbb']

Comprender la salida: 

  • Nuestro RE es ab*, el cual ‘a’ acompañado de cualquier no. de ‘b’s, a partir de 0.
  • La salida ‘ab’ es válida debido a que la única ‘a’ está acompañada de la única ‘b’.
  • La salida ‘abb’ es válida debido a que solo ‘a’ está acompañada de 2 ‘b’.
  • La salida ‘a’ es válida debido a que solo ‘a’ está acompañada de 0 ‘b’.
  • La salida ‘abbb’ es válida debido a que solo ‘a’ está acompañada de 3 ‘b’.

re.dividir() 

Divida la string por las ocurrencias de un carácter o un patrón, al encontrar ese patrón, los caracteres restantes de la string se devuelven como parte de la lista resultante. 

Sintaxis: 

re.split(pattern, string, maxsplit=0, flags=0)

El primer parámetro, el patrón denota la expresión regular, la string es la string dada en la que se buscará el patrón y en la que se produce la división, maxsplit si no se proporciona se considera cero ‘0’, y si se proporciona cualquier valor distinto de cero, entonces a lo sumo que se produzcan muchas divisiones. Si maxsplit = 1, entonces la string se dividirá una sola vez, lo que dará como resultado una lista de longitud 2. Las banderas son muy útiles y pueden ayudar a acortar el código, no son parámetros necesarios, por ejemplo: banderas = re.IGNORECASE, en esta división , se ignorarán las mayúsculas y minúsculas, es decir, las minúsculas o las mayúsculas.

Ejemplo 1:

Python

from re import split
 
# '\W+' denotes Non-Alphanumeric Characters
# or group of characters Upon finding ','
# or whitespace ' ', the split(), splits the
# string from that point
print(split('\W+', 'Words, words , Words'))
print(split('\W+', "Word's words Words"))
 
# Here ':', ' ' ,',' are not AlphaNumeric thus,
# the point where splitting occurs
print(split('\W+', 'On 12th Jan 2016, at 11:02 AM'))
 
# '\d+' denotes Numeric Characters or group of
# characters Splitting occurs at '12', '2016',
# '11', '02' only
print(split('\d+', 'On 12th Jan 2016, at 11:02 AM'))

Producción: 

['Words', 'words', 'Words']
['Word', 's', 'words', 'Words']
['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM']
['On ', 'th Jan ', ', at ', ':', ' AM']

Ejemplo 2:

Python

import re
 
# Splitting will occurs only once, at
# '12', returned list will have length 2
print(re.split('\d+', 'On 12th Jan 2016, at 11:02 AM', 1))
 
# 'Boy' and 'boy' will be treated same when
# flags = re.IGNORECASE
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here', flags=re.IGNORECASE))
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here'))

Producción: 

['On ', 'th Jan 2016, at 11:02 AM']
['', 'y, ', 'oy oh ', 'oy, ', 'om', ' h', 'r', '']
['A', 'y, Boy oh ', 'oy, ', 'om', ' h', 'r', '']

re.sub() 

El ‘sub’ en la función significa SubString, se busca un cierto patrón de expresión regular en la string dada (tercer parámetro), y al encontrar el patrón de substring se reemplaza por repl (segundo parámetro), el conteo verifica y mantiene el número de veces esto ocurre. 

Sintaxis:

 re.sub(pattern, repl, string, count=0, flags=0)

Ejemplo 1:

Python

import re
 
# Regular Expression pattern 'ub' matches the
# string at "Subject" and "Uber". As the CASE
# has been ignored, using Flag, 'ub' should
# match twice with the string Upon matching,
# 'ub' is replaced by '~*' in "Subject", and
# in "Uber", 'Ub' is replaced.
print(re.sub('ub', '~*', 'Subject has Uber booked already',
             flags=re.IGNORECASE))
 
# Consider the Case Sensitivity, 'Ub' in
# "Uber", will not be replaced.
print(re.sub('ub', '~*', 'Subject has Uber booked already'))
 
# As count has been given value 1, the maximum
# times replacement occurs is 1
print(re.sub('ub', '~*', 'Subject has Uber booked already',
             count=1, flags=re.IGNORECASE))
 
# 'r' before the pattern denotes RE, \s is for
# start and end of a String.
print(re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam',
             flags=re.IGNORECASE))

Producción 

S~*ject has ~*er booked already
S~*ject has Uber booked already
S~*ject has Uber booked already
Baked Beans & Spam

re.subn() 

subn() es similar a sub() en todos los sentidos, excepto en su forma de proporcionar resultados. Devuelve una tupla con un recuento del total de reemplazo y la nueva string en lugar de solo la string. 

Sintaxis:

 re.subn(pattern, repl, string, count=0, flags=0)

Ejemplo:

Python

import re
 
print(re.subn('ub', '~*', 'Subject has Uber booked already'))
 
t = re.subn('ub', '~*', 'Subject has Uber booked already',
            flags=re.IGNORECASE)
print(t)
print(len(t))
 
# This will give same output as sub() would have
print(t[0])

Producción 

('S~*ject has Uber booked already', 1)
('S~*ject has ~*er booked already', 2)
Length of Tuple is:  2
S~*ject has ~*er booked already

re.escape()

Devuelve una string con todos los caracteres no alfanuméricos con barra invertida, esto es útil si desea hacer coincidir una string literal arbitraria que puede tener metacaracteres de expresión regular.

Sintaxis:

re.escape(string)

Ejemplo:

Python

import re
 
# escape() returns a string with BackSlash '\',
# before every Non-Alphanumeric Character
# In 1st case only ' ', is not alphanumeric
# In 2nd case, ' ', caret '^', '-', '[]', '\'
# are not alphanumeric
print(re.escape("This is Awesome even 1 AM"))
print(re.escape("I Asked what is this [a-9], he said \t ^WoW"))
Producción

This\ is\ Awesome\ even\ 1\ AM
I\ Asked\ what\ is\ this\ \[a\-9\]\,\ he\ said\ \    \ \^WoW

investigar()

Este método devuelve Ninguno (si el patrón no coincide) o un re.MatchObject contiene información sobre la parte coincidente de la string. Este método se detiene después de la primera coincidencia, por lo que es más adecuado para probar una expresión regular que para extraer datos.

Ejemplo: Búsqueda de una ocurrencia del patrón

Python3

# A Python program to demonstrate working of re.match().
import re
 
# Lets use a regular expression to match a date string
# in the form of Month name followed by day number
regex = r"([a-zA-Z]+) (\d+)"
 
match = re.search(regex, "I was born on June 24")
 
if match != None:
 
    # We reach here when the expression "([a-zA-Z]+) (\d+)"
    # matches the date string.
 
    # This will print [14, 21), since it matches at index 14
    # and ends at 21.
    print ("Match at index %s, %s" % (match.start(), match.end()))
 
    # We us group() method to get all the matches and
    # captured groups. The groups contain the matched values.
    # In particular:
    # match.group(0) always returns the fully matched string
    # match.group(1) match.group(2), ... return the capture
    # groups in order from left to right in the input string
    # match.group() is equivalent to match.group(0)
 
    # So this will print "June 24"
    print ("Full match: %s" % (match.group(0)))
 
    # So this will print "June"
    print ("Month: %s" % (match.group(1)))
 
    # So this will print "24"
    print ("Day: %s" % (match.group(2)))
 
else:
    print ("The regex pattern does not match.")
Producción

Match at index 14, 21
Full match: June 24
Month: June
Day: 24

Igualar objeto

Un objeto Match contiene toda la información sobre la búsqueda y el resultado y, si no se encuentra ninguna coincidencia, se devolverá None. Veamos algunos de los métodos y atributos de uso común del objeto de coincidencia.

Obtener la string y la expresión regular

El atributo match.re devuelve la expresión regular pasada y el atributo match.string devuelve la string pasada.

Ejemplo: obtener la string y la expresión regular del objeto coincidente

Python3

import re
 
s = "Welcome to GeeksForGeeks"
 
# here x is the match object
res = re.search(r"\bG", s)
 
print(res.re)
print(res.string)
Producción

re.compile('\\bG')
Welcome to GeeksForGeeks

Obtener el índice del objeto coincidente

  • El método start() devuelve el índice inicial de la substring coincidente
  • El método end() devuelve el índice final de la substring coincidente
  • El método span() devuelve una tupla que contiene el índice inicial y final de la substring coincidente

Ejemplo: obtener el índice del objeto coincidente 

Python3

import re
 
s = "Welcome to GeeksForGeeks"
 
# here x is the match object
res = re.search(r"\bGee", s)
 
print(res.start())
print(res.end())
print(res.span())
Producción

11
14
(11, 14)

Obtener substring coincidente

El método group() devuelve la parte de la string para la que coinciden los patrones. Vea el siguiente ejemplo para una mejor comprensión.

Ejemplo: obtener una substring coincidente 

Python3

import re
 
s = "Welcome to GeeksForGeeks"
 
# here x is the match object
res = re.search(r"\D{2} t", s)
 
print(res.group())
Producción

me t

En el ejemplo anterior, nuestro patrón especifica la string que contiene al menos 2 caracteres seguidos de un espacio, y ese espacio va seguido de una t. 

Artículo relacionado: 
https://www.geeksforgeeks.org/regular-expressions-python-set-1-search-match-find/

Referencia: 
https://docs.python.org/2/library/re.html

Este artículo es una contribución de Piyush Doorwar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *