Expresiones regulares

Hace algunos días me vi en la necesidad de aprender a usar expresiones regulares en python, justo en esos días me encontré con un comic con el que me sentí identificado…

Y es que a quien no le ha pasado que después de aprender alguna nueva habilidad, técnica, etc, no busca la manera de usarla tanto como sea posible.

Bueno en caso de que hallan entrado aquí para aprender a usar las expresiones regulares no se preocupen no pondré solo el comic sino que compartiré el programa que escribí, pero primero la explicación de lo que hace aunque no profundizare en el por que lo hice…

Primeramente para quien no conoce que es una expresión regular (tal vez entraron a este blog de forma accidental), les dejo la definición de la wikipedia:

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón “H(a|ä|ae)ndel”. La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Específicamente, las expresiones regulares se construyen utilizando los operadores unión concatenación y clausura de Kleene.

El programa lee un archivo de texto (por ejemplo un txt aunque originalmente lo pensé para un html) buscando todas las ocurrencias de una letra mayúscula seguida por un numero (X1, G6, Y77, R55, etc.) y lo le agrega “+ al inicio y +” al final ( X1 pasa a ser +X1+” ), solo buscara las letras mayúsculas de manera que cualquier ocurrencia en letras minúsculas no sea cambiada (h1, h4, t1, etc. quedan igual).

Adicionalmente agrega V1=” al inicio de cada linea y “: ASCII(5,V,1,2) al final ademas de un salto de linea (\n) por ejemplo:

Linea original: Si el valor de X1 es igual a H777 entonces…

Linea generada: V1=”Si el valor de “+X1+” es igual a “+H777+” entonces…\n“: ASCII(5,V,1,2)

Todo lo anterior lo almacena en un nuevo archivo con el mismo nombre pero extensión .kplr (miArchivo.txt se guarda como miArchivo.txt.kplr)

Bueno sin mas les dejo el código del programa

import sys          # sys (para el paso de argumentos),
import os.path    # os.path (para comprobar la validez del archivo)
import re          # y re (para las expresiones regulares)

if(len(sys.argv) > 1):   # comprobamos que exista un parámetro
    archivo=sys.argv[1]   # lo asignamos a la variable archivo
    existeF = os.path.exists(archivo)  #comprobamos que exista el archivo
    if existeF: # si existe el archivo...
        lee = open(archivo,"r")  # lo abrimos como solo lectura
        escribe = open(archivo+".kplr","w")  # creamos el archivo con extensión .kplr
        while True: # bucle para leer todas las lineas
            linea = lee.readline() # leemos una linea
            if not linea: # nos aseguramos que sea una linea
                break # de lo contrario terminamos el bucle
            lineaNueva=linea.rstrip() # quitamos a la linea los caracteres que no queremos (el salto de linea)
            lineaNueva=re.sub(r'([A-UW-Z]\d+)',r'"+\1+"',lineaNueva) # sustituimos las ocurrencias de nuestra expresion
            lineaEscribe='V1="'+lineaNueva+'": ASCII(5,V,1,2) \n' # añadimos lo que queremos al inicio y final de la cadena
            escribe.write(lineaEscribe) # guardamos la linea en nuestro archivo .kplr
        print "Codigo kplr creado correctamente" # al terminar mostramos el mensaje de todo correcto
    else: # si no existe el archivo
        print "El archivo no existe, debes indicar un nombre de archivo valido" # mostramos mensaje de error
else: # si no se paso un parámetro
    print "Debes indicar el nombre del archivo" # mostramos mensaje de error

En fin, espero que este preograma les sirva, aunque sea para darse una idea de como usar las expresiones regulares.

Links…

Comic xkcd

Expresiones regulares en la wikipedia.

2 thoughts on “Expresiones regulares”

  1. Muy bueno!!, y creo que le empiezo a ver buenas aplicaciones a esto de las expresiones regulares en archivos que se encuentren en lenguaje ensamblador!!!

    Saludos

Comments are closed.