Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Juze 1
Juze 1
(e-libro)
Para evitar informacion erroneas o estadisticas falsas, la limpieza de datos se considera
un problema sumamente importante. Para la eliminacion de registros duplicados se han
creado varios metodos y entre estos esta la limpieza de datos basada en la
correspondencia de expresiones regulares.
HAM (Maquina Abstracta de Hipertexto) (e-libro)
HAM intenta modelar el nivel de almacenamiento de un sistema de hipertexto (Paginas
HTML). Un grafo HAM contiene, contexto, atributos, nodos y enlaces que se organizan
de forma jerarquica. La informacion de de un nodo pueden ser interrogados con
patrones de expresiones regular introducidas por el usuario.
Expresiones regulares como motor de bsqueda.
Las expresiones regulares permiten encontrar partes especficas de texto dentro de una
cadena de caracteres. As, si es necesario encontrar el texto "lote" en la expresin "el
ocelote salt al lote contiguo" cualquier motor de bsqueda sera capaz de efectuar esta
labor. Sin embargo, la mayora de los motores de bsqueda encontraran tambin el
fragmento "lote" de la palabra "ocelote", lo cual podra no ser el resultado esperado.
Algunos motores de bsqueda permiten adicionalmente especificar que se desea
encontrar solamente palabras completas, solucionando este problema. Las expresiones
regulares permiten especificar todas estas opciones adicionales y muchas otras sin
necesidad de configurar opciones adicionales, sino utilizando el mismo texto de
bsqueda como un lenguaje que permite enviarle al motor de bsqueda exactamente lo
que deseamos encontrar en todos los casos, sin necesidad de activar opciones
adicionales al realizar la bsqueda.
Bibliografia
Limpieza de datos Lopez, Porrero, Beatriz E. Perez Vazquez, Ramiro A. Edit.
Feijoo Cuba 2009
Conceptualizacion, prototipado y proceso de aplicaciones hipermedia Navarro
Martin, Antonio Fernandez-Valmayor Crespo, Alfredo Fernandez Manjon, Baltasar
Edit. Universidad Complutense de Madrid Espaa 2006
http://www.emezeta.com/articulos/introduccion-a-las-expresionesregulares#axzz1Waw9Ct3x
Sin embargo, un buen manejo de las expresiones regulares es algo tan poderoso que vale la pena que nos tomemos
un tiempo para aprender a utilizarlas. Adems, saber manejar expresiones regulares nos servir no solamente en el
mundo de las bases de datos Oracle; las podremos usar tambin en otros lenguajes de programacin como Perl,
Java, .Net, Php y Unix Shell Scripting, entre otros.
La idea de este documento es hacer una introduccin al tema de manera prctica, comenzando con ejemplos
sencillos para luego ir aumentando la complejidad.
Comenzamos entonces definiendo a una expresin regular como una cadena de caracteres que definen un patrn de
bsqueda. En una expresin regular encontramos literales y metacaracteres. Los literales se leen al pie de la letra.
Los metacaracteres son caracteres que tienen un significado especial.
Tomemos por ejemplo la siguiente expresin regular:
[n|p]ata
Los metacaracteres son los corchetes y el smbolo pipe (|). El resto son literales.
Los corchetes agrupan a varios caracteres en un solo caracter.
El smbolo pipe indica un smbolo u otro; es decir la 'n' o la 'p'.
Luego, la expresin regular:
[n|p]ata
Seguramente el lector se preguntar cmo determinar qu elementos de una expresin regular son literales y qu
elementos son metacaracteres. Ms adelante encontrar la respuesta. Sigamos.
Para qu sirven las Expresiones Regulares?
En una base de datos Oracle existen diversos escenarios en que la implementacin de expresiones regulares
constituye una herramienta de gran utilidad:
Bsqueda de texto. Las expresiones regulares nos permiten hacer bsquedas complejas de cadenas de
caracteres dentro de las columnas de nuestras tablas.
Formateo de datos. Podemos modificar los datos proyectados en las sentencias SELECT, invirtiendo
palabras, agregando o quitando caracteres, etc.
Definicin de constraints. A fin de forzar el contenido de una columna para que se ajuste a un formato
determinado: casilla de correo, nmero telefnico, etc.
Manipulacin de datos. Por ejemplo, regularizando datos en procesos de migracin desde aplicaciones
legacy y aplicando reglas de bsqueda y reemplazo (Search & Replace).
Entendiendo las Expresiones Regulares
Como se haba dicho anteriormente, en una expresin regular encontramos literales y metacaracteres. Al analizar
una expresin regular, lo primero que tenemos que hacer es determinar qu elementos son literales y qu elementos
son metacaracteres (tambin llamados operadores). Existe una larga lista de metacaracteres soportados por Oracle.
No es la intencin estudiarlos a todos en este documento. A continuacin iremos viendo algunos.
Cadena
Coincide?
Anlisis
casa
Si
Coinciden los literales y en la posicin del operador punto aparece slo un carcter
cana
Si
Coinciden los literales y en la posicin del operador punto aparece slo un carcter
cara
Si
Coinciden los literales y en la posicin del operador punto aparece slo un carcter
canta
No
pala
No
Vemos nuevamente tres literales y el metacaracter Suma. Busquemos el patrn en las siguientes cadenas y veamos
las coincidencias.
Cadena
Coincide?
Anlisis
cassa
cassssa
cassssssss
a
Si
El smbolo ms (+) es precedido por la subexpresin "s". Por lo tanto todas las
cadenas que tienen una o ms "s" en a partir de la tercer posicin y respetan el resto
de los literales, coinciden con el patrn representado en la expresin regular.
Caa
No
Lasa
No
Tassa
No
Cadena
Coincide?
Anlisis
Casa
cassssa
cassssssss
a
Si
El smbolo asterisco (*) es precedido por la subexpresin "s". Por lo tanto todas las
cadenas que tienen cero o ms "s" a partir de la tercera posicin y respetan el resto
de los literales, coinciden con el patrn representado en la expresin regular.
caa
Si
lasa
No
tassa
No
El metacaracter [char...]
Coincide con una sola ocurrencia de alguno de los caracteres de la lista entre corchetes. En la lista, todos los
caracteres son tomados como literales excepto algunos caracteres que son interpretados como metacaracteres. Aqu
nos limitaremos a mencionar el metacaracter '-' para representar rangos de caracteres. Analicemos la siguiente
expresin regular:
ca[snt]a
Cadena
Coincide?
Anlisis
casa
Si
Coinciden los literales y en la posicin del operador aparece slo un carcter y es de los
de la lista
cana
Si
Coinciden los literales y en la posicin del operador aparece slo un carcter y es de los
de la lista
cata
Si
Coinciden los literales y en la posicin del operador aparece slo un carcter y es de los
de la lista
cara
No
canta
No
pasa
No
Como se dijo anteriormente, en la lista se puede utilizar el metacaracter rango '-'. Haciendo uso de este metacaracter
la siguiente lista de caracteres:
[123456789]
Cadena
Coincide?
Anlisis
a3h9
Si
a33f9
No
a3z9
No
El metacaracter [^char...]
El sombrerito (^) que precede a la lista indica que los literales que le siguen no deben estar en la cadena de
caracteres para que se produzca una coincidencia. Veamos,
ca[^snt]a
Cadena
Coincide?
Anlisis
casa
No
Coinciden los literales y en la posicin del operador aparece un carcter de los negados
en la lista
cana
No
Coinciden los literales y en la posicin del operador aparece un carcter de los negados
en la lista
cata
No
Coinciden los literales y en la posicin del operador aparece un carcter de los negados
en la lista
cara
Si
Coinciden los literales y en la poscion del operador aparece un carcter que no est en la
lista de literales negados.
canta
No
para
No
Cadena
Coincide?
Anlisis
chauchau
Si
chauholachau
Si
Coinciden los literales y la expresin 'hola' aparece una vez, es decir cero o
ms veces.
chauholaholacha
u
Si
Coinciden los literales y la expresin 'hola' aparece dos veces, es decir cero o
ms veces.
holachau
No
chau
No
Los literales que componen la palabra 'hola' deben estar al inicio de la lnea para que se produzca la coincidencia con
el patrn expresado.
Cadena
Coincide?
Anlisis
hola
Si
chauhola
No
holachau
Si
holahola
Si
Coincide con el final de lnea y el operador est representado con el carcter pesos ($). En la expresin regular
hola$
Los literales que componen la palabra 'hola' deben estar al final de la lnea para que se produzca la coincidencia con
el patrn expresado.
Cadena
Coincide?
Anlisis
Hola
Si
chauhola
Si
holachau
No
holahola
Si
Coincide?
Anlisis
hola
No
Hola*
Si
hol*
No
Hasta aqu hemos visto algunos de los metacaracteres que se usan con ms frecuencia. Combinando varios de
estos metacaracteres en una sola expresin regular, podemos hacer construcciones ms complejas y muy
poderosas. Analicemos la siguiente expresin regular en la que encontramos varios metacaracteres
^hola[0-9]*chau[^a]+$
^hola
[0-9]*
chau
[^a]+$
La lnea debe continuar hasta el final con uno o ms caracteres distintos de 'a'
Cadena
Coincide?
Anlisis
hola123chau
b
Si
Comienza con el texto 'hola'. Le siguen varios dgitos entre 0 y 9. Le sigue el literal
'chau' y finaliza con al menos una letra distinta de 'a'.
holachauc
Si
Comienza con el texto 'hola'. No aparecen dgitos del 0 al 9 (el asterisco indica que
esto es aceptado para que haya coincidencia). Luego aparece el literal 'chau' y se
finaliza con una letra distinta de 'a'
hola0chaua
No
REGEXP_LIKE
Condicin que se puede utilizar en la clusula WHERE de una sentencia SQL SELECT y
que permite retornar aquellas filas que coinciden con el patrn especificado en una
expresin regular.
REGEXP_COUNT
Funcin que permite contar el nmero de veces que un patrn aparece en una cadena de
caracteres.
REGEXP_INSTR
REGEXP_REPLAC
E
Funcin que permite hacer bsqueda y reemplazo en una cadena de caracteres utilizando
expresiones regulares para la bsqueda.
REGEXP_SUBSTR
Funcin para extraer de una cadena una subcadena de caracteres que coincidan con un
patrn especificado en una expresin regular.
Veamos algunos ejemplos de implementacin de estas condiciones y funciones combinadas con el uso de
expresiones regulares.
La condicin REGEXP_LIKE es similar a la condicin LIKE pero, a diferencia del LIKE, utiliza patrones basados en
expresiones regulares para la bsqueda de coincidencias en las cadenas de caracteres analizadas.
En el siguiente ejemplo, vemos una tabla de empleados cuyos nombres fueron migrados de un sistema legacy. En
muchos casos el nombre ha quedado separado del apellido por varios espacios en blanco:
SQL> select nombre from empleados;
NOMBRE
---------------------------------------Fernando
Garcia
Marcelo Burgos
Marcelo
Ochoa
Gerardo
Tezza
Clarisa Maman Orfali
Rodolfo Pajuelo Quispe
6 rows selected.
El nico caso de un solo espacio entre el nombre y el apellido es el de Clarisa Maman Orfali. Veamos cmo podemos
construir un query que detecte aquellas filas en que haya dos o ms espacios separando nombres de apellidos.
SQL> select nombre
2 from empleados
3 where regexp_like(nombre, '[ ][ ][ ]*');
NOMBRE
----------------------------------------
Fernando
Garcia
Marcelo Burgos
Marcelo
Ochoa
Gerardo
Tezza
Rodolfo Pajuelo Quispe
Corrijamos esta situacin dejando un solo blanco de separacin en donde hay dos o ms espacios en blanco.
SQL> update empleados
2 set nombre = regexp_replace(nombre, '[ ][ ][ ]*', ' ')
3 where regexp_count(nombre, '[ ][ ][ ]*') > 0;
5 rows updated.
Bastante bien. Salvo el caso de Marcelo Ochoa, en donde nos qued un espacio en blanco al principio de la lnea.
Eliminemos entonces los espacios en blanco que estn al principio de la lnea.
SQL>
2
3
4
update empleados
set nombre = regexp_replace(nombre, '^ ')
where regexp_count(nombre, '^ ') > 0
/
1 row updated.
SQL> select nombre from empleados;
NOMBRE
---------------------------------------Fernando Garcia
Marcelo Burgos
Marcelo Ochoa
Gerardo Tezza
Clarisa Maman Orfali
Rodolfo Pajuelo Quispe
6 rows selected.
En este otro ejemplo vemos una tabla de impuestos en la que almacenamos un cdigo de identificacin tributaria
numrico y que debe respetar el siguiente formato:
99-99999999-99
SQL> select cuit from impuestos;
CUIT
------------20-20198123-9
10-43112345-8
1-22123987-9
8883838382
aa-75212456-x
A fin de evitar que la tabla siga admitiendo cdigos que no respetan el formato, podemos crear una constraint que
fuerce el ingreso de cdigos que respeten el formato.
alter table impuestos
add constraint c_cuit
check (regexp_like(cuit,'[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9]'))
enable novalidate
/
Table altered.