Autor

Alejandro Alcalde

Data Scientist and Computer Scientist. Creator of this blog.

Más artículos de Alejandro Alcalde | Porfolio

Índice

En esta entrada voy a intentar introducir brevemente cómo crear expresiones regulares en python (dentro de la complejidad de las mismas).

Son recopilaciones que he hecho durante el curso de *Programming languages en udacity y voy a intentar explicarlos lo más claramente posible.

Lo primero que hay que hacer para usar expresiones regulares es importar el módulo re de python con import re

Una vez hecho esto, podemos empezar a usar expresiones, como por ejemplo esta:

regex = r'[a-z]+-?[a-z]+'

La expresión de arriba considerará válida cualquier cadena que empieze con una o más letras ([a-z]+), seguido de un guión, que es opcional, es decir, puede aparecer o no en la cadena (-?) seguido nuevamente de uno o más caracteres de la a a la z, en minúsculas.

Algunos casos de ejemplo son los siguientes:

# Ejemplos válidos:
print re.findall(regexp,"well-liked") == ["well-liked"]
#>>> True
print re.findall(regexp,"html") == ["html"]
#>>> True
# Ejemplos no válidos:
print re.findall(regexp,"a-b-c") != ["a-b-c"]
#>>> True
print re.findall(regexp,"a--b") != ["a--b"]
#>>> True

La primera expresión de los ejemplos no válidos no es correcta ya que el segundo guión no es esperado por la expresión regular, en el segundo ejemplo, ocurre lo mismo.

El siguiente ejemplo servirá para coincidir con cadenas que representen funciones matemáticas de un solo parámetro:

regexp = r"[a-z]+( *[0-9]+ *)"

Esto encontrará cadenas que empiecen con una o más letras ([a-z]+), tenemos que escapar los paréntesis para que los tome como algo que queremos que forme parte de la cadena, ya que los paréntesis tienen un significado especial en la expresiones regulares, los escapamos con \, despues buscamos por cero o más espácios ( *) seguidos de números ([0-9]+) y nuevamente cero o más espacios.

Ejemplos:

# Ejemplos válidos
print re.findall(regexp,"cos(0)") == ["cos(0)"]
#>>> True
print re.findall(regexp,"sqrt(   2     )") == ["sqrt(   2     )"]
#>>> True
# Ejemplos no válidos
print re.findall(regexp,"cos     (0)") != ["cos     (0)"]
#>>> True
print re.findall(regexp,"sqrt(x)") != ["sqrt(x)"]
#>>> True

Como vemos, el primer ejemplo no válido precisamente no es válido porque no permitimos espacios entre el nombre de la función y los paréntesis. El segundo es erróneo porque el parámetro es una letra en lugar de un número.

Veamos otro más, esta vez queremos encontrar cadenas que contengan caracteres de escape () y comillas

regexp = r'"(?:[^\\]|(?:\.))*"'

En este caso voy a ir explicando de fuera hacia adentro, en primer lugar vamos a buscar cadenas que estén entrecomilladas (r’""’), lo que encontremos, lo vamos a encontrar cero o más veces (r’”(?:)”‘), (?:) coincide con la expresión regular que contenga entre los paréntesis. A continuación queremos cualquier cosa que no sea un \, y nótese que debemos escaparlo (r’”(?:[^])”‘) ó (|) un . seguido de cualquier caracter (r’”(?:[^\]|(?:.))”‘*)

Ejemplos:

regexp = r'"(?:[^\\]|(?:\.))*"'
#  Ejemplos válidos:
print re.findall(regexp,'"I say, \"hello.\""') == ['"I say, \"hello.\""']
#>>> True
#  Ejemplos no válidos:
print re.findall(regexp,'"\"') != ['"\"']
#>>> True

Por último una expresión regular que coincidirá con todas las cadenas que estén entre dobles comillas:

regexp = r'"[^"]*"'

Con esta expresión buscamos cadenas que empiecen y acaben obligatóriamente con (r’"'), no pueden contener ningún caracter " entre la cadena (r'"[^"]'), finalmente, daremos por buena la cadena que cumpla esto con cualquier caracter cero o más veces (r'"[^"]*"').

Ejemplos:

#  Ejemplos  válidos:
print re.findall(regexp,'"cuneiform"')
print re.findall(regexp,'"sumerian writing"')
print re.findall(regexp,'""')
#  Ejemplos no válidos
print re.findall(regexp,'"esc " ape"')

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.

Categorías:Etiquetas:

Quizá también te interese leer...