Está en la página 1de 7

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE CIENCIAS

ESCUELA PROFESIONAL DE CIENCIA DE LA


COMPUTACIÓN
TEORÍA DE LA COMPUTACIÓN

Nombre del informe: Expresiones Regulares


Nombres de los alumnos: Cristian Aguirre Janampa
Daniel Hidalgo Chávez
Raúl Huamán Pajares

Fecha de entrega: 12 de Mayo del 2018


Profesor: Víctor Melchor

2018
Expresiones Regulares

Definicion

Es una forma de reconocimiento y/o extracción de datos a partir de un patrón o texto formando
una cadena donde ciertos caracteres (metacaracteres - metacharacters) tiene un significado
especial. Esto es mas fácil de reconocer mediante un ejemplo que una definición. Usaremos el
lenguaje de programación Python en este informe, dado que es muy útil para poder ver y
aprovechar las utilidades de las expresiones regulares.

Ejemplo:

Este programa usa una expression regular, cuenta en cuantas lineas aparece la palabra
“hello”.

import re

regexp = re.compie(“hello”)

count = 0

file = open(“textfile”, ‘r’)

for line in file.readlines():

if regexp.search(line):

count = count + 1

file.close()

print(count)

El input (texfile) vendría ser el siguiente:

Hello world, my name is hello


in these lines I just want to tell you that
you should use python more often.
Did hello you?
Did I?
Hello?
Hello, hello-hello-hello

Output

>> 3

El número que nos resulta es ‘3’ pues hemos hecho que el código analiza si UNA LÍNEA
contiene la cadena ‘hello’. En caso hayan más de 1 coincidencia por línea, solo se contará
una vez.
Expresiones Regulares con caracteres especiales

Es una forma de identificar las minúsculas y mayúscula en nuestras expresiones regulares. Un


carácter especial is un carácter en una expresión regular que es interpretado por Python de
diferente manera, es decir, tiene un algún significado especial.

Ejemplo

Por ejemplo | significa “ó”, asi la expresión regular selecciona la expresión “hello” o “Hello”.

● regexp = re.compile(“hello|Hello”)

Otra manera de hacer esto es, con un “paréntesis”. El “paréntesis” es un carácter especial para
agrupar expresiones, en este ejemplo puede tomar “h” o “H”.

● regexp = re.compile(“(h|H)ello”)

Otra manera de selección, seria con “[]” y tomar caracteres simples dentro de los corchetes.
Hay una buena manera de aprovechar esto, podemos asignar un rango de la forma “[a-z]”. Asi
para este ejemplo usamos “[hH]”.

● regexp = re.compile(“[hH]ello”)

En estos 3 casos, cada vez que Python al compilar lea “hello” o “Hello” lo reconocerá como el
mismo y el contador aumentará en uno.

Para nuestro caso anterior obtendremos de output ‘4’

Expresiones regulares con cadenas sin procesar

Son secuencias de caracteres que tienen significados especiales como ‘\n’ o ‘\t’ contenidos en
líneas de un archivo de texto

Ejemplo

Deseamos conocer si está la secuencia de caracteres “\\ten” en un archivo de texto.

Incorrecto:
regexp = re.compile(“\\ten”)
regexp = re.compile(“\\\\ten”)

Correcto:
regexp = re.compile(r“\\ten”)

La importancia de una cadena sin procesar o raw string


Una cadena sin procesar es similar a una cadena pero con un prefijo ‘r’ el cual da como aviso al
momento de correr el código que se tomara un carácter con funcionalidad especial y lo tome
de la forma correcta

Ejemplo

>>> r”Hello” == “Hello”

(Verdadero)

>>> r”\the” ==”\the”

(Falso)

En el segundo caso es falso ya que al existir el “r” avisa que se tomara un caracter con
funcionalidad especial que sera el \t de este modo no sera igual a “the” caso contrario
en el primer caso existe el r pero no presenta ningun caracter especial por lo tanto la
igualdad es verdadera

Extraccion de textos acertados a partir de cadenas

Un uso comun de las expresiones regulares es la de extraer datos a partir de patrones. Con un
ejemplo se puede ver mejor la aplicacion de este método.

Ejemplo

Deseamos obtener datos de una lista con determinadas características:

Apodo, Nombre Apellido: NumeroDeTelefono

Para este ejemplo consideraremos lo siguiente:

● El apellido puede estar o no inscrito


● El número de teléfono puede o no tener código de área

Solucion
Asumamos que el nombre, apodo y apellido consiste en letras y, posiblemente, guión;
y usaremos ‘[]’ para caracteres especiales para definir solo los del nombre:
[-a-zA-z]

Este patrón coincidirá con solo un guión, o una letra minúscula, o una letra mayúscula

En el caso de un nombre como “McDonald” debemos hacer uso de ‘+’


[-a-zA-Z] +

Para los números telefónicos

Podríamos utilizar \d para hacer coincidir con cualquier dígito. Esto nos quedaría de la
siguiente forma:
\d\d\d-\d\d\d-\d\d\d\d

El problema es que no todos tendrán código de área. De modo que haremos uso de lo
ya aprendido
(\d\d\d-)?\d\d\d-\d\d\d\d

Estaríamos obteniendo el siguiente resultado:

[-a-zA-Z]+, [-a-zA-Z]+( [-a-zA-Z]+)?: (\d\d\d-)?\d\d\d-\d\d\d\d

Para anticipar problemas de comas y espacios entre estas y lo que deseamos


(problemas de tipeo) debemos hacer lo siguiente:

import re
regexp = re.compile(r“[-a-zA-Z]+,”
r“[-a-zA-Z]+”
r“( [-a-zA-Z]+)?”
r“: (\d\d\d-)?\d\d\d-\d\d\d\d”
)
file = open(“textfile”, ‘r’)
for line in file.readlines():
if regex.search(line):
print(“Match!”)
file.close()
Uso de patrones:

Afortunadamente con el modulo de expresiones regulares de Python, podemos usar


expresiones regulares para extraer datos desde patrones, claramente primero debe verificar su
existencia. Agrupamos cada subpatrón correspondiente a una parte de la data que se desea
extraer usando ‘()’, como esto: ‘?P<name>’. Luego, tenemos que nombrar los elementos del
patrón, para hacer esto, podemos extraer los datos usando el método “group”. Esto es posible
ya que al usar la función “search” y este returna con éxito, esto no solo retorna Verdadero,
sino que retorna una estructura que graba que fue encontrado como expresión regular. Para
nuestro caso usamos la siguiente expresión para dar uso a los patrones.

(?P<apodo>[-a-zA-Z]+), (?P<nombre>[-a-zA-Z]+) ( (?P<apellido>[-a-zA-Z]+)))?:


(?P<numeroDeTelefono>(\d\d\d-)?\d\d\d-\d\d\d\d)

Obtenemos lo siguiente (del ejemplo anterior)

import re
regexp = re.compile(r“(?P<apodo>[-a-zA-Z]+),”
r“(?P<nombre>[-a-zA-Z]+)”
r“( (?P<apellido>[-a-zA-Z]+)))?”
r“: (?P<numeroDeTelefono>(\d\d\d-)?\d\d\d-\d\d\d\d)”
)
file = open(“textfile”, ‘r’)
for line in file.readlines():
result = regexp.search(line)
if result == None:
print(“Not record”)
else:
Apodo = result.group(‘apodo’)
Nombre = result.group(‘nombre’)
Apellido = result.group(‘apellido’)
if Apellido == None:
Apellido = “ ”
NumeroDeTelefono = result.group(‘numeroDeTelefono’)
print(‘Sujeto: ’, Nombre, Apellido, Apodo, ‘Numero: ’, NumeroDeTelefono)
file.close()

Sustitución de textos con expresiones regulares

Podemos también usar el modulo de expresiones regulares de Python para encontrar cadenas
y reemplazarlos por otra cadena. El método usado es el sub.

Con un ejemplo queda más claro la aplicación.

Ejemplo
Reemplazaremos el “the the” por “the” de la siguiente manera:

>>> import re
>>> string = “If the the problem is textual, use the the re module”
>>> pattern = r“the the”
>>> regexp = re.compile(pattern)
>>> regexp.sub = (“the”, string)

Output:

‘If the problem is textual, use the re module’

La funcionalidad del método “sub” es el siguiente : Utiliza o graba la expresión regular


encontrada, en este caso es regexp, y produce una nueva cadena, reemplazando todas las
expresiones regulares encontradas en la cadena (segundo argumento de “sub” , en este caso
“string”) por el valor del primer argumento, en este caso “the”.

Para mostrar lo útil que es Python con expresiones regulares, el primero argumento no
necesariamente tiene que ser una cadena, en vez de eso puede ser una función. Si es así,
entonces Python llamara a la función con su correspondiente objeto de expresiones regulares
(match_obj).

Ejemplo

Una aplicación a este método es cambiar el output de un entero a un número real (agregarle
.0).

>>> import re
>>> int_string = “1 2 3 4 5”
>>> def int_match_to_float(match_obj):
… return(match_obj.group(‘num’) + “.0”)

>>> pattern = r“(?P<num>[0-9]+)”
>>> regexp = re.compile(pattern)
>>> regexp.sub(int_match_to_float, int_string)
>>> print(regexp.sub(int_match_to_float, int_string))

‘1.0 2.0 3.0 4.0 5.0’

Es necesario rescatar las siguientes funcionalidades: El patrón “num” consiste de 1 o mas


dígitos (del 0 al 9), pero en nuestro caso, nuestro string solo tiene valores del 1 al 5, entonces
nuestro método “sub” escanea esta cadena y busca expresiones regulares (0-9), cuando “sub”
encuentra a estos, lo reemplaza llamando a la función int_match_to_float. Esta función usa el
método “group” para extraer los datos y produce una nueva cadena, concatenándolo con .0

“sub” retorna una nuva cadena. Finalmente vuelve a escanear justo después de donde
encontró la última expresión regular a reemplazar y vuelve hacerlo hasta que no encuentra
ninguna expresión regular más.

También podría gustarte