Tema 6
Tema 6
Tema 6
Aspectos avanzados
Índice
© Universidad Internacional de La Rioja (UNIR)
Esquema 3
Ideas clave 4
6.1. Introducción y objetivos 4
6.2. Expresiones regulares 4
6.3. Errores y excepciones 11
6.4. Compresión de listas 18
© Universidad Internacional de La Rioja (UNIR)
Aspectos avanzados
Lanzar errores
Tema 6. Esquema
Esquema
En un tema anterior vimos algunas funciones dentro de las cadenas de caracteres que
nos permitían obtener los caracteres que ocupan posiciones concretas o conocer la
posición de subcadenas que ya conocemos. Sin embargo, en muchas ocasiones
necesitamos buscar otras subcadenas que no tienen el mismo contenido siempre,
Las expresiones regulares son una secuencia de caracteres con otros caracteres
especiales que nos permiten definir patrones de texto. Utilizando estas expresiones
regulares, podemos buscar estos patrones en cadenas de texto.
import re
search(): esta función busca la primera aparición del patrón en la cadena de texto.
Como resultado nos devuelve un objeto de tipo match en el que podemos obtener
las posiciones donde se encuentra el patrón dentro de la cadena de texto. En caso
de que no exista el patrón dentro de la cadena, la función devuelve un objeto None.
sub(): permite sustituir los patrones encontrados por otra subcadena que
pasamos por parámetro.
Estas son las funciones más importantes. Sin embargo, ahora es necesario conocer
cómo construir patrones más complejos que nos permitan buscar subcadenas con
diferente contenido, pero con quien tengan un patrón en común, por ejemplo, fechas
de nacimiento, apellidos, localidades, etc. Para los siguientes ejemplos usaremos un
texto más amplio extraído de Wikipedia:
Literales: estos son los elementos que contienen únicamente caracteres básicos.
Son los que hemos visto en los ejemplos anteriores para explicar las funciones del
módulo re.
Para usarlos, solo debemos incluirlos dentro de una cadena de texto que usaremos
en la función correspondiente del módulo re. Por ejemplo, si queremos sustituir
todos los saltos de línea por el texto “**AQUÍ**” en el texto, aplicaremos el
carácter de escape correspondiente para usarlo en la función sub:
© Universidad Internacional de La Rioja (UNIR)
Vamos a ver esto a través de un ejemplo. Imaginemos que queremos capturar las
palabras que empiecen por se- y que tengan otra palabra a continuación. Para ello
podemos usar el siguiente patrón:
pattern = 'se\w+\s\w+'
re.findall(pattern, texto) # Devolverá ['sentido para', 'ser descifrado',
'sentido en']
Sin embargo, nosotros solo queremos conocer cuál es la palabra que empieza por
se- y no el resto de los elementos, es decir, la palabra que viene a continuación.
Para ello, agrupamos el patrón que define las palabras que empiezan por se-
usando los paréntesis:
pattern = '(se\w+)\s\w+'
re.findall(pattern, texto) # Devolverá ['sentido', 'ser', 'sentido']
© Universidad Internacional de La Rioja (UNIR)
Como se puede apreciar, esto nos permite capturar únicamente la parte que nos
interesa del patrón, es decir, las palabras que empiezan por se- pero que, además,
tienen otra palabra a continuación.
pattern = 'es|ser'
re.sub(pattern, '**AQUI**', texto)
ejemplo = '122333114444'
pattern = '(1*2)'
re.findall(pattern, ejemplo) # Devolverá ['12', '2']
• []: nos permite representar clases de caracteres, es decir, buscará cadenas que
tengan algunos de los caracteres definidos dentro de los corchetes. Por
ejemplo, a continuación, buscaremos qué parte de la cadena tiene los dígitos 2
o 3 repetidos entre 2 y 3 veces:
En este apartado vamos a explicar qué son los errores y las excepciones de un
programa y qué herramientas nos proporciona Python para gestionarlos.
Errores
Notebook.
En este caso, Python nos devuelve un error de tipo TypeError, es decir, un error
asociado a los tipos de datos. El error se ha producido exactamente en la tercera línea
y, además, nos muestra un mensaje que explica por qué se ha producido ese error.
En este caso, Python nos indica que solo se pueden concatenar tipos string, no
enteros, que es lo que estamos intentando hacer en este caso.
Los errores más comunes que nos podemos encontrar en nuestros programas son los
siguientes:
Errores de tipo: son como los que acabamos de ver. Se producen cuando no
podemos realizar una operación porque el tipo de datos de alguno de los
elementos no es válido.
Existen otros muchos errores que podemos tener al ejecutar nuestros programas. Sin
embargo, estos son los que encontraremos con más frecuencia.
Excepciones
Para alguno de estos errores es interesante que termine la ejecución, ya que son
errores críticos que imposibilitan que continuemos con nuestro programa. Pero, en
otras ocasiones, podemos asumir que un error de cierto tipo puede ocurrir en algún
© Universidad Internacional de La Rioja (UNIR)
Para poder hacer esto utilizaremos las excepciones. Una excepción es un bloque de
código que se ejecutará cuando se detecte un error de algún tipo y, después,
podremos seguir ejecutando nuestro programa. Para poder hacer esto, es necesario
try:
bloque_con_posibles_errores
except:
bloque_de_excepcion
lista = [2, 3, 4]
try:
print(lista[5])
except:
print("No existe esa posición")
En este código accederemos a la posición de una lista, pero queremos ejecutar una
excepción si esa posición no existe. En esa excepción se nos mostrará un mensaje,
pero luego seguirá con la ejecución del programa. El sistema nos mostrará los
siguientes mensajes al ejecutarse:
Es posible crear más de un bloque except para que nos permitan ejecutar diferentes
bloques de código para diferentes tipos de errores. Para ello incluiremos el tipo de
lista = [2, 3, 4]
try:
print(lista[5])
except IndexError:
print("No existe esa posición")
except TypeError:
print("El tipo de la operación es erróneo")
except:
print("Ha ocurrido otro error")
Como se puede observar, hemos incluido una sentencia final, sin definir el tipo de
error. Este bloque se ejecutará si ha ocurrido un error, pero no se ha ejecutado
ninguno de los otros bloques except. A la estructura try-except se le pueden incluir
más tipos de bloques, como veremos a continuación.
Bloque else
try:
bloque_con_posibles_errores
except:
bloque_de_excepcion
else:
bloque_else
© Universidad Internacional de La Rioja (UNIR)
Vamos a ampliar el ejemplo anterior para que, en el caso de que no se haya detectado
ningún error, se muestre otro mensaje. Para ello también cambiaremos la posición a
la que accedemos.
try:
print(lista[2])
except:
print("No existe esa posición")
else:
print("Está perfecto")
4
Está perfecto
Sigo con la ejecución
Bloque finally
La estructura completa try-except con todos los bloques sería como se muestra a
continuación:
try:
bloque_con_posibles_errores
except:
bloque_de_excepcion
© Universidad Internacional de La Rioja (UNIR)
else:
bloque_else
finally:
bloque_finally
lista = [2, 3, 4]
try:
print(lista[2])
except:
print("No existe esa posición")
else:
print("Está perfecto")
finally:
print("Hemos terminado el bloque try-except")
4
Está perfecto
Hemos terminado el bloque try-except
Sigo con la ejecución
El bloque finally se utiliza mucho para cerrar ficheros o conexiones a bases de datos,
se haya producido o no un error, para asegurarnos que cerramos dicha conexión.
Lanzar errores
En ocasiones, es útil para nosotros lanzar un error para que se gestione en otro lado
de nuestro programa. Para ello, usaremos la sentencia raise, seguida del tipo de
error y el mensaje que queremos mostrar. Vamos a ver el uso de esta sentencia en el
siguiente ejemplo:
© Universidad Internacional de La Rioja (UNIR)
try:
raise TypeError("Este es un ejemplo de error personalizado")
except:
print("He detectado un error")
La compresión de listas es una forma que nos proporciona Python que nos permite
crear listas donde cada uno de los miembros de la lista es el resultado de una
operación. Por ejemplo, imaginemos que queremos crear una lista que almacene el
resultado de aplicar el cuadrado a los números de 1 a 10. Usando un bucle for, lo
haríamos de la siguiente manera:
result = []
for i in range(1, 11):
result.append(i ** 2)
© Universidad Internacional de La Rioja (UNIR)
Sin embargo, esta operación se puede realizar de una forma más sencilla gracias a la
compresión de listas. La estructura de una compresión de listas es como:
En el ejemplo anterior, cada uno de los elementos serían: i**2 (operación), i (ítem),
range(1,11) (secuencia). Es decir, podemos aplicar compresión de listas en el
ejemplo anterior de la siguiente manera:
Como se puede observar, hemos hecho la misma acción, pero en este caso lo hemos
implementado en una única línea. El uso de compresión de listas hace que el código
sea más compacto y, sobre todo, que la ejecución sea mucho más rápida.
Por ejemplo, podemos hacer que una lista almacene el resultado de aplicar el
cuadrado únicamente a los números múltiplos de 3 que existan desde 1 a 10:
Estas sentencias nos permiten crear nuevas listas de una forma muy sencilla. Sin
embargo, la compresión puede ser aplicada a otros tipos de colecciones. A
continuación, explicaremos cómo aplicar a otras colecciones compatibles.
Para los diccionarios, es necesario que definamos la clave y el valor de cada elemento
que insertemos en ellos. Por este motivo, la expresión de compresión para
diccionarios debe incluir ambos conceptos, el resto de la expresión es igual que la
anterior:
Conjuntos
Al igual que pasa con los diccionarios, tenemos que adaptar la expresión de
compresión para que se creen conjuntos. En este caso, usaremos los símbolos de
creación de conjuntos, seguidos de la misma estructura de compresión que
usábamos con las listas:
Por ejemplo, si queremos crear una secuencia que almacena el resultado de aplicar
el cuadrado a los números pares que hay de 1 a 10, aplicaríamos la siguiente
sentencia:
© Universidad Internacional de La Rioja (UNIR)