Comprensión de listas y Expresiones regulares en Python 3

1. Comprensión de listas

Crear una lista con letras de una palabra:

# Método tradicional

lista = []

for letra in ‘casa’:

lista.append(letra)

# Método con comprensión de listas 

lista = [letra for letra in ‘casa’]

Crear una lista con las potencias de 2, de los primeros 10 números:

# Método tradicional 

lista = []

for numero in range(0,11):

lista.append(numero**2)

# Método con comprensión de listas

lista = [numero**2 for numero in range(0,11)]

Crear una lista con todos los múltiples de 2 de entre 0 y 10:

# Método tradicional 

lista = []

for numero in range(0,11):

if numero % 2 == 0:

lista.append(numero)

# Método con comprensión de listas

lista = [numero for numero in range(0,11) if numero % 2 == 0]

Crear una lista de números pares, a partir de otra lista creada con las potencias de 2, de los primeros 10 números:

# Método tradicional

lista = []

for numero in range(0,11):

lista.append(numero**2)

pares = []

for numero in lista:

if numero % 2 == 0:

pares.append(numero)

# Método con comprensión de listas

pares = [ numero for numero in [numero**2 for numero in range(0,11)] if numero % 2 == 0 ]

2. Expresiones regulares

re.search : buscar un patrón en una cadena

import re

texto = “En esta cadena se encuentra una palabra mágica”

palabra = “mágica”

encontrado = re.search(palabra, texto)

Esta función no devuelve true o false, si no, si existe o no existe.

if encontrado is not None:

print(“Se ha encontrado la palabra”)

else:

print(“No se ha encontrado la palabra”)

Podemos utilizar .start .end .span .string para ver donde empieza o acaba la coincidencia, o visualizarlo en forma de tupla o que nos devuelva el texto donde hemos buscado:

encontrado.start()

40

encontrado.end()

46

encontrado.span()

(40, 46)

encontrado.string

‘En esta cadena se encuentra una palabra mágica’

 

re.match : buscar un patrón al principio de otra cadena

texto = “Hola mundo”

re.match(“Hola”, texto)

<_sre.SRE_Match object; span=(0,  4), match=’Hola’>

 

re.split : dividir una cadena a partir de un patrón

texto = “Vamos a dividir esta cadena”

re.split(‘  ‘, texto)

[‘Vamos’, ‘a’, ‘dividir’, ‘esta’, ‘cadena’]

 

re.sub : sustituye todas las coincidencias en una cadena

texto = “Hola amigo”

re.sub(“amigo”, “amiga”, texto)

‘Hola amiga’

 

re.findall :  busca todas las coincidencias en una cadena

texto = “hola adios hola hola”

re.findall(“hola”, texto)

[‘hola’, ‘hola’, ‘hola’]

# Con un len, podríamos saber cuantas veces se repite un patrón dentro de una cadena

len(re.findall(“hola”, texto))

3

 

# O incluso podemos usar findall con un or

texto = “hola adios hello hola bye”

re.findall(“(hola|hello)”, texto)

[‘hola’, ‘hello’, ‘hola’]

Patrones con sintaxis repetida:

texto = “hla hola hoola hooola hoooooola”

def buscar(patrones, texto):

for patron in patrones:

print( re.findall(patron, texto) )

Meta-carácter * : ninguna o mas veces ese carácter a su izquierda

patrones = [‘ho*la’]

buscar (patrones, texto)

[‘hla’, ‘hola’, ‘hoola’, ‘hooola’, ‘hoooooola’]

 

Meta-carácter + : una o más repeticiones de la letra a su izquierda

texto = “hla hola hoola hooola hoooooola”

patrones = [‘ho+’]

buscar(patrones, texto)

[‘ho’, ‘hoo’, ‘hooo’, ‘hooooo’]

Meta-carácter ? : una o ninguna repetición de la letra a su izquierda

patrones = [‘ho?’,‘ho?la’]

buscar(patrones, texto)

[‘h’, ‘ho’, ‘ho’, ‘ho’, ‘ho’]

[‘hla’, ‘hola’]

Con un número de repeticiones explicito de la letra a su izquierda: {n}

texto = “hla hola hoola hooola hoooooola”

patrones = [‘ho{0}’, ‘ho{1}la’, ‘ho{3}la’]

buscar(patrones, texto)

[‘hla’]

[‘hola’]

[‘hooola’]

Sintaxis con rango {n, m}

texto = “hla hola hoola hooola hoooooola”

patrones = [‘ho{0,1}la’, ‘ho{1,2}la’, ‘ho{2,10}la’]

buscar(patrones, texto)

[‘hla’, ‘hola’]

[‘hola’, ‘hoola’]

[‘hoola’, ‘hooola’, ‘hoooooola’]

 

Trabajando con conjuntos de caracteres []

texto = “hala hela hila hola hula”

patrones = [‘h[ou]la’, ‘h[aio]la’, ‘h[aeiou]la’]
buscar(patrones, texto)

[‘hola’, ‘hula’]

[‘hala’, ‘hila’, ‘hola’]

[‘hala’, ‘hela’, ‘hila’, ‘hola’, ‘hula’]

Podemos utilizar repeticiones :

texto = “haala heeela hiiiila hoooooola”

patrones = [‘h[ae]la’, ‘h[ae]*la’, ‘h[io]{3,9}la’]
buscar(patrones, texto)

[]
[‘haala’, ‘heeela’]
[‘hiiiila’, ‘hoooooola’]

Operador de exclusión [^ ] para indicar una búsqueda contraria 

texto = “hala hela hila hola hula”

patrones = [‘h[o]la’, ‘h[^o]la’]
buscar(patrones, texto)

[‘hola’]
[‘hala’, ‘hela’, ‘hila’, ‘hula’]

Rangos [ – ]

  • [A-Z]: Cualquier carácter alfabético en mayúscula (no especial ni número)
  • [a-z]: Cualquier carácter alfabético en minúscula (no especial ni número)
  • [A-Za-z]: Cualquier carácter alfabético en minúscula o mayúscula (no especial ni número)
  • [A-z]: Cualquier carácter alfabético en minúscula o mayúscula (no especial ni número)
  • [0-9]: Cualquier carácter numérico (no especial ni alfabético)
  • [a-zA-Z0-9]: Cualquier carácter alfanumérico (no especial)

texto = “hola h0la Hola mola m0la M0la”

patrones = [‘h[a-z]la’, ‘h[0-9]la’, ‘[A-z]{4}’, ‘[A-Z][A-z0-9]{3}’]
buscar(patrones, texto)

[‘hola’]

[‘h0la’]

[‘hola’, ‘Hola’, ‘mola’]

[‘Hola’, ‘M0la’]

 

Códigos escapados \

Código Significado
\d numérico
\D no numérico
\s espacio en blanco
\S no espacio en blanco
\w alfanumérico
\W no alfanumérico

 

El problema que encontraremos en Python a la hora de definir código escapado, es que las cadenas no tienen en cuenta el \ a no ser que especifiquemos que son cadenas en crudo (raw), por lo que tendremos que preceder las expresiones regulares con una ‘r’.

texto = “Este curso de Python se publicó en el año 2017”

patrones = [r’\d+’, r’\D+’, r’\s’, r’\S+’, r’\w+’, r’\W+’]
buscar(patrones, texto)

[‘2017’]
[‘Este curso de Python se publicó en el año ‘]
[‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘]
[‘Este’, ‘curso’, ‘de’, ‘Python’, ‘se’, ‘publicó’, ‘en’, ‘el’, ‘año’, ‘2017’]
[‘Este’, ‘curso’, ‘de’, ‘Python’, ‘se’, ‘publicó’, ‘en’, ‘el’, ‘año’, ‘2017’]
[‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘]

Autor entrada: CharlieJ

Deja un comentario

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