Buscar temas sin respuesta | Ver temas activos |

Nuevo tema Responder al tema Índice general » Programación: lo ultimo » Python Ir a página 1, 2  Siguiente
Autor Mensaje
Desconectado 
 Asunto: expresion regular en html repetitivo
NotaPublicado: 11 Ago 2007 20:18 

Registrado: 14 Sep 2004 23:08
Mensajes: 7340
tengo que sacar un valor de una pagina web:

Código:
<tr>
            <td colspan="2" width="100%"><span class="form2">Wireless Port</span></td>

          </tr>
          <tr>
            <td class="form" width="40%">IP Address</td>
            <td width="60%">
            192.168.120.2

            </td>
          </tr>
          <tr>
            <td class="form" width="40%">Subnet Mask</td>

            <td width="60%">
            255.255.255.0

            </td>
          </tr>
        <tr>
          <td class="form" width="40%">MAC Address</td>
          <td width="60%">
            00:0a:52:7a:8e:2c
          </td>
        </tr>



esta estructura se repite varias veces en la pagina que estoy examinando. el tema es que a mi me interesa nada mas la mac, de la estructura que tiene titulo "Wireless Port"

yo ya tengo una exprecion que me identifica bien la mac, lo que pasa es que aparecen muuchas mac en el documento.

cual seria la forma mas eficiente de machear la mac nomas??

gracias!


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 11 Ago 2007 20:49 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
Suponiendo que usas PCRE se me ocurre rápidamente:

Código:
"/Wireless Port.*?(([0-9a-f]{2}:){5}([0-9a-f]{2})).*?<\/td>/"

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 11 Ago 2007 21:21 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
Me falto aclararte que, dependiendo el motor que uses tendrás que agregarle uno o más modificadores, básicamente para que el . (punto) "atrape" los fin de linea, como también una para multi-linea.
El resultado lo vas a obtener le da referencia \1 que corresponde al grupo (paréntesis) exteriores.

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 11 Ago 2007 21:30 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
en python :)

Código:
>>> import re
>>> s = file("mac").read()
>>> r = re.compile("Wireless Port.*?(([0-9a-f]{2}:){5}([0-9a-f]{2})).*?<\/td>",re.S)
>>> r.findall(s)[0][0]
'00:0a:52:7a:8e:2c'

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 11 Ago 2007 21:31 

Registrado: 14 Sep 2004 23:08
Mensajes: 7340
estoy importando re, voy a ver lo de los modificadores a ver que onda.

interesante :) voy a tener que profundisar mis conocimientos sobre expreciones.

mil gracias!!


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 11 Ago 2007 21:50 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
Por nada.

Es muy linda la teoría de autómatas finitos y lenguajes formales :)

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 00:09 

Registrado: 14 Sep 2004 23:08
Mensajes: 7340
tenes alguna lectura para recomendar sobre la teoria?


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 00:32 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
A nivel práctico de lo que te interesa de las expresiones regulares, sin ver lo que hay dentro de "la cajita negra" tenés:
http://www.regular-expressions.info

y esto es ver representada una expresión regular gráficamente con autómatas finitos (mooy mooy bueno):
http://osteele.com/tools/reanimator

Una tabla resumen interesante:
http://www.greenend.org.uk/rjk/2002/06/regexp.html

El secreto, creo, de la RE que te escribí, esta en la modificación de como funciona el cuantificador "*" agregándole el ?, eso hace que sea en modo "non-greedly" o "lazy", lo que significa que va a capturar sólo la coincidencia más corta posible y no la más larga. De no poner el "*?" capturas TODO, y lo que le sigue en la expresión es como ignorado.

Lamentablemente esto en algunos motores como el de POSIX REGEX no lo tienen y hay que hacerlo de otra forma, caso típico de las utilidades AWK, SED, GREP.

Salut!.

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 01:04 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
ejemplo:

Citar:
"t.*h"
"hola viiiiteeeeeeeeeeeeeeeehhhhhhkakakakakaakakaka"


Citar:
"t.*?h"
"hola viiiiteeeeeeeeeeeeeeeehhhhhhkakakakakaakakaka"


Jajaja, te lo resalto esto, porque cuando lo "descubrí" fue muy muy divertido.

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 08:00 

Registrado: 14 Sep 2004 23:08
Mensajes: 7340
muy interesante :), justo estaba leyendo sobre eso en el howto re de python

http://www.amk.ca/python/howto/regex/

muy interesante los link, los voy a leer a todos :)


es algo bastante interesante hacer programas inteligentes que te automaticen tareas :)


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 18:47 
poster a 1 tbps
Avatar de Usuario

Registrado: 12 Ene 2004 13:15
Mensajes: 1583
Ubicación: localhost
Para tareas de este tipo también hay herramientas inteligentes como puede ser templatemaker, de uno de los padres de Django.

Básicamente le mostrás un montón de páginas hechas con el mismo template y "aprende" el formato del sitio. Después de este aprendizaje, le podés suministrar otra página que siga el mismo template y te extrae la información de la misma.

http://www.holovaty.com/blog/archive/2007/07/06/0128


Las cosas que hago para no aprender bien expresiones regulares...


Saludos ;)


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 20:06 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
GomoX escribió:
Las cosas que hago para no aprender bien expresiones regulares...


Suena interesa.
Pero no seas vago!, encima vos que estas estudiando ciencias de la computación, te deben enfermar con lenguajes.

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 12 Ago 2007 21:32 

Registrado: 14 Sep 2004 23:08
Mensajes: 7340
buena data gomox, pero esto no esta relacionado solo con las paginas, obtengo informacion de varios medios...

gracias!


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 17 Ago 2007 20:22 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
una pequeña mejora :)

Al usar paréntesis para definir al grupo repetitivo ([0-9a-f]{2}:){5}, además de eso se esta creando una referencia "hacia atrás" que no hace falta, entonces se puede evitar usando lo mismo pero luego de la apertura del paréntesis poner "?:". Tampoco la parte final hace falta.

Notar la diferencia (antes de usar "reduce fast fast"):

Código:
>>> r = re.compile("Wireless Port.*?(([0-9a-f]{2}:){5}([0-9a-f]{2})).*?<\/td>",re.S)
>>> r.findall(s)
[('00:0a:52:7a:8e:2c', '8e:', '2c')]


Se generan tres grupos por los tres paréntesis correspondientes, pero con la mejora:
Código:
>>> r = re.compile("Wireless Port.*?((?:[0-9a-f]{2}:){5}(?:[0-9a-f]{2}))",re.S)
>>> r.findall(s)
['00:0a:52:7a:8e:2c']
>>> r.findall(s)[0]
'00:0a:52:7a:8e:2c'



Llaaameyaaaaaa!!!

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 17 Ago 2007 20:34 
poster a 1 tbps
Avatar de Usuario

Registrado: 12 Ene 2004 13:15
Mensajes: 1583
Ubicación: localhost
JPA, el programa aprende de cualquier feed que le tires, no solo de HTML.

Gera, lenguajes todavía no me tocó :) Debería aprender bien regexes ya a esta altura, pero de las cosas que tengo en el tintero, hay otras que me llaman más.

Saludos ;)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 27 mensajes ]  Ir a página 1, 2  Siguiente


  Imprimir vista Tema previo | Siguiente tema 

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados


Todos los horarios son UTC - 3 horas


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron
PC++ Style
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë