Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more ➡
Download
Standard view
Full view
of .
Add note
Save to My Library
Sync to mobile
Look up keyword
Like this
3Activity
×
0 of .
Results for:
No results containing your search query
P. 1
El Poder de Gnuplot y las expresiones regulares

El Poder de Gnuplot y las expresiones regulares

Ratings: (0)|Views: 653|Likes:
Published by Aprender Libre
Lo mejor de ser una lenguaje
interpretado y dinámico es que
puedes hablar con otras aplicaciones muy fácilmente y Python es capaz de hablar con Gnuplot.
Ya podemos hacer gráficas con
Python.
Lo mejor de ser una lenguaje
interpretado y dinámico es que
puedes hablar con otras aplicaciones muy fácilmente y Python es capaz de hablar con Gnuplot.
Ya podemos hacer gráficas con
Python.

More info:

Published by: Aprender Libre on Jun 30, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See More
See less

02/01/2013

pdf

text

original

 
3535
Número 05
WWW.LINUX
-
MAGAZINE.ES
agrupe por fecha y genere un histogramacon ellas. Parece complicado, pero vamosa ver como no lo es tanto.Para ello vamos a utilizar las expre-siones regulares que Python provee. Conellas podremos procesar texto en buscade patrones fácilmente. Una vez quetengamos un conocimiento básico sobreellas echaremos un vistazo a Gnuplot y ala manera de usarlo desde Python.
Las expresiones regulares
Las expresiones regulares trabajan consímbolos, en nuestro caso caracteres, ydefinen patrones de caracteres como, porejemplo, palabras o direcciones IP.Podemos buscar una frase o parte de ella,por ejemplo “From: algo.tw”. Esta expre-sión regular corresponde con … ¡ellamisma!, lo cual no es demasiado útil.Necesitamos algo que abarque más posi-bilidades.Lo interesante es definir patrones.Imaginemos que queremos definir unpatrón para capturar direcciones decorreo. Normalmente estará formada por:unas secuencia de caracterespertenecientes a un conjuntorestringido (por ejemplo no sepermiten tildes)una arrobauna secuencia de caracterespertenecientes al mismo con-junto restringidouna última secuencia dedominioO sea, algo como “spamer@spam.tw”. Siqueremos crear un patrón para este tipode cadena de símbolos necesitamosreglas.Las expresiones regulares permitenimponer restricciones. Podemos imponercondiciones sobre la aparición de los sím-bolos. En concreto podemos determinar
E
xisten muchos programas quegeneran gráficas sobre informa-ción importante. Por ejemplo,muchos sitios web tienen gráficas quemuestran cuantos accesos se han rea-lizado ese mismo día. También seríainteresante controlar la cantidad de acce-sos por SSH que nuestra máquina recibecomo medida de seguridad.
Gráficas y más gráficas
Y ya que estamos, ¿por qué no hacer grá-ficas de cosas interesantes? Una de lascosas que más nos atraen es controlarcomo crece, o decrece, el número deficheros en el sistema operativo o sutamaño. ¿Es útil? no lo sé, pero desdeluego es curioso.Nuestro objetivo este mes es el si-guiente: crear un programa con Pythonque mediante expresiones regulares quelocalice entradas en un fichero de log,
El Poder de Gnuplot y las expresiones regulares
GRAFICASCONPYTHON
Lo mejor de ser una lenguajeinterpretado y dinámico es quepuedes hablar con otras aplica-ciones muy fácilmente y Pythones capaz de hablar con Gnuplot.Ya podemos hacer gráficas conPython.
POR JOSÉ MARÍA RUIZ YPEDRO ORANTES
Python •
DESARROLLO
 
la cantidad y la posición. Indicar si esecarácter o caracteres van a aparecer o noy la cantidad de veces que lo hará.El patrón más simples es que el buscala aparición obligatoria de un solo carác-ter. Basta con poner ese carácter tal cualen la expresión regular: “q”. Si el carácteres uno de entre un conjunto de posiblescaracteres, por ejemplo los caracteres “K”o “c”, encerramos a ambos entrecorchetes: “[Kc]”. Esto indica que espe-ramos un solo carácter, pero escogidoentre “K” o “c”. En el caso de que eseúnico carácter sea opcional acompañare-mos la expresión de un signo de interro-gación: “[Kc]?”.Ahora vamos a ver como controlar lacantidad de caracteres. En nuestra intro-ducción básica solo vamos a ver lasreglas más simples. Estas son las queindican si el carácter puede aparecerseguido “0 o más veces” o “1 o másveces”. En en primer caso acom-pañamos al carácter o caracteres (entre“[]”) de un “*” y en el segundo caso deun “+”:[a]*: , a, aa, aaa*[a]+: a, aa, aaa,Sería muy engorroso tener que ponertodo el abecedario si queremos definir elpatrón para una palabra. Por eso existenlos grupos de caracteres. El grupo “a-z”define todas las letras del abecedario y“0-9” todos los números. Así, el patrón“[a-z]*” define una secuencia de 0 o máscaracteres, y “[0-9]+” un número de almenos una cifra (que puede ser el “0” ).El patrón “[A-Z]” se corresponde con lasletras del abecedario en mayúsculas.Existe también patrones especiales quedefinen, por ejemplo, los caracteres quepueden formar una palabra, o los sepa-radores.Cuando un carácter puede ser malinterpretado, porque ya forma parte de lasintaxis de las expresiones regulares,entonces hay que acompañarlo por un“\”. El caso típico es el carácter “-”, queaparecerá como “\-”.Después de esta breve introducción, uncorreo electrónico que provenga de Tai-wan podría corresponder con la siguienteexpresión regular: “[\-a-zA-Z0-9]+@[\-a-zA-Z0-9]+.tw”.Imaginemos que queremos un patrónpara un carácter que puede sercualquiera símbolo menos el “9”. Paraello usamos el carácter “^” dentro de “[]”. “[^9]” sería el patrón que correspon-dería con cualquier carácter menos el“9”.Dentro de los corchetes “^” define unpatrón inverso, decimos lo que no quere-mos y el patrón se corresponde con elresto. En cambio si usamos “^” fuera delos corchetes su significado cambia, pasaa significar “al principio”. La expresiónregular “^[0-9]+” corresponde con unacadena de números que está al principiode la cadena en la que buscamos, si noestá al principio no se corresponderá. Laexpresión regular “[^0-9]+” corres-ponde con una cadena de al menos unsímbolo que no puede ser numérico. Portanto, hay que ser cuidadoso con dondese ponen los modificadores (ver Tabla demodificadores).Con esto nos podemos hacer una ideade cómo son las expresiones regulares.En realidad faltan muchos más modifi-cadores, pero el lector pueden encontrargran cantidad de tutoriales sobre expre-siones regulares en Internet. En particu-lar recomendamos el indicado en elrecurso [3], pero tiene el inconvenientede estar en inglés.
Expresiones Regulares enPython
En Python tenemos expresiones regu-lares a través del paquete
re
(de “RegularExpressions”). Este paquete forma partedel sistema base de Python por lo quenos será necesario instalarlo. Lo primeroque vamos a hacer va a ser definir unaexpresión regular simple y juguetear conella.
>>> import re>>> p = re.compile("[ab]+")>>> print p<_sre.SRE_Pattern object
at 0x81418c0>>>>
Hemos creado un objeto que representala expresión regular “[ab]*”, o sea, unasecuencia de “a“y “b” que puede tenerlongitud 0. Como vemos al imprimir elcontenido de “p” no es más que unobjeto como todos los demás de Python.Vamos a pasarle unas serie de cadenasa ver que nos dice:
>>> print p.match("34",1)None>>> print p.match("abaaab",1)<_sre.SRE_Match object at
0x81b4800>>>> print p.match("abaaabc",1)<_sre.SRE_Match object at
0x81b4800>>>>
En el primero ejemplo vemos como nosdevuelve
 None
. Eso significa que noexiste ninguna subcadena dentro de lacadena que le hemos pasado que se co-rresponda con el patrón. En el segundoejemplo vemos como nos devuelve unobjeto, ese objeto contiene informaciónsobre la correspondencia hallada. Eneste caso es toda la cadena pasada.En el tercer ejemplo vuelve a devolver-nos un objeto, pero vemos que esa “c”final no está en el patrón. Lo que ocurrees que Python busca subcadenas quecorrespondan, no busca la correspon-dencia de toda la cadena pasada.Por el momento hemos usado elmétodo
match()
que solo busca lacorrespondencia al principio de lacadena o en la posición que le indique-mos (en nuestro caso la posición
1
).
>>> print p.match("cabaaab"
,0)None>>> print p.match("abaaab",0)<_sre.SRE_Match object at
0x81c4c60>>>>
Existe otro método llamado
search()
quese comporta de manera parecida a lasexpresiones regulares de Perl. Buscatodas las correspondencias y es posibleobtener una lista de ellas. Pero lo másútil es el método
findall()
, devuelve unalista con todas las apariciones delpatrón.
>>> resultado = p.search(
"abaaabcaaaa",1)
DESARROLLO
• Python
36
Número 05
WWW.LINUX
-
MAGAZINE.ES
Figura 1: Gnuplot muestra representacionesde funciones de manera rápida y sencilla.
 
Python •
DESARROLLO
37
Número 05
WWW.LINUX
-
MAGAZINE.ES
láser, o un fichero gráfico, como unfichero JPEG, o directamente una ven-tana gráfica en Xwindow.Aprovechando esta característicapodemos desarrollar la configuración deuna gráfica directamente en el shell deGnuplot visualizando en una ventana.Una vez que sepamos la configuraciónnecesaria, solo tenemos que cambiar el
terminal
.Las variables se pueden ver usando elcomando
show
:
gnuplot> show terminalterminal type is x11gnuplot><_sre.SRE_Match object at
0x81b4800>>>>>>> p.findall("abaaabcaaa",0)['abaaab', 'aaa']
Introducción a Gnuplot
Gnuplot (véase recurso [1]) es un pro-grama de dibujado de datos. Se le pasandatos o una función matemática y se usala orden
 plot 
para hacer la gráfica. Gnu-plot entonces abre una ventana y dibujaesos datos usando los parámetros que leespecifiquemos.Cuando ejecutamos Gnuplot nos apare-cerá un shell. Gnuplot tiene sus propioscomandos y lenguaje. Lo mejor de tenerun shell es que podemos jugar con él,vamos a hacerlo:
gnuplot> f(x) = sin(x)gnuplot> plot f(x)gnuplot>
Veremos que aparece una ventana comola mostrada en la Figura 1. Es la funciónseno, que hemos dibujado con solo dosinstrucciones. Parece interesante ¿no?. Laorden
 plot 
acepta muchos parámetros.Podemos dibujar muchas funciones a lavez, usar pequeños cuadraditos o puntospara diferenciarlas, interpolar puntos,etc. Gnuplot permite además realizarmuchos tipos de gráficas: de dos dimen-siones, de tres dimensiones, histogra-mas…Una característica que nos va a resultarde mucha utilidad es que permite expor-tar las gráficas a formatos gráficos están-dar, como gif o png. Podemos hacer todasla pruebas usando como salida una ven-tana de Xwindows y cuando estemosseguros de los comandos y parámetrosnecesarios usar como salida un archivográfico.
El programa Gnuplot
Gnuplot está diseñado para que nospermite automatizar su uso a través descripts compuestos por sus propioscomandos. La idea es poder usarlo enuna de esas famosas tuberías a travésde las que los usuarios de UNIX másavanzados pueden crear aplicacionesenteras.Gnuplot necesita un
terminal
parafuncionar que actúa como driver deimpresión. Este
terminal
puede ser obien una máquina, como una impresora
01 #!/usr/local/bin/python0203 from Numeric import *04 i m p o r t G n u p l o t ,Gnuplot.funcutils05 import re;0607 class Grafica:0809 def __init__(self, cadena):10 s e l f . g =Gnuplot.Gnuplot(debug=1)11 self.g.title('Mi gráfica')12 self.g('set data stylelinespoints')13 self.g('set boxwidth 0.9absolute')14 self.g('set style fill solid1.000000 border -1')15 self.g('set style histogramclustered gap 5 title 0, 0')16 self.g('set style datahistograms')17 self.g('set title \"Lineascon ' + cadena +' \"')1819 self.hash = {}20 self.cadena = cadena2122 d e f c a r g a D a t o s ( s e l f ,fichero):2324 archivo = file(fichero,'r')2526 self.hash = {}2728 e x p r =re.compile(self.cadena);2930 for linea in archivo:31 if( re.sear ch(expr ,linea)):32 lista = linea.split(' ')33 fecha = lista[0]+''+lista[1]34 i f ( n o tself.hash.has_key(fecha)):35 self.hash[fecha] = 136 else:37 self.hash[fecha] =self.hash[fecha] + 13839 archivo.close()404142 def dibuja(self):4344 llaves = self.hash.keys()45 llaves.sort()464748 etiquetas = "set xtics ("4950 i = 051 lista = []5253 for llave in llaves:54 etiquetas = etiquetas +"\"" + llave + "\" " + str(i)+ " ,"55lista.append([self.hash[llave],i])56 i = i+15758 etiquetas = etiquetas +"\"fin\"" + str(i) + ")"596061 s e l f . g ( ' s e t x r a n g e[0:'+str(i-1)+']')62 self.g('set yrange [0:30]')6364 self.g(etiquetas)6566 self.g.plot(lista)67 r a w _ i n p u t ( ' P u l s aINTRO...\n')68 self.g.reset()697071 if __name__ == "__main__":72 g = Grafica('ssh')73 g.cargaDatos('prueba.txt')74 g.dibuja()
Listado 1:gnuplotter.py

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->