[Python-es] Presentación y duda con módulo re

Chema Cortes pych3m4 en gmail.com
Mar Abr 2 03:20:26 CEST 2013


El día 2 de abril de 2013 00:30, Javier Alonso
<javieralonsogil en gmail.com> escribió:
> Saludos a todos,
>
> Me llamo Javier, trabajo como administrador de sistemas y estoy aprendiendo
> python por el gran juego que puede dar en este área.
>
> Ahora mismo estoy desarrollando una herramienta que me permita trabajar
> fácilmente con ficheros de zonas de Bind, pero estoy teniendo problemas con
> el módulo re.
>
> Tengo la siguiente cadena:
>
>
> @       IN      SOA     ns1.nameserverprimario.com. admin.dominio.com. (
>                         2013022101       ; serial, todays date + todays
> serial #
>                         7200              ; refresh, seconds
>                         540              ; retry, seconds
>                         604800              ; expire, seconds
>                         86400 )            ; minimum, seconds
>
> Aunque podría ser la siguiente también:
>
> @       IN      SOA     ns1.nameserverprimario.com. admin.dominio.com. (
> 2013022101     7200  540  604800    86400 )
>
> Estoy intentando crear un método que le pases la cadena, y devuelva un
> diccionario del estilo:
>
> Zona : @
> Tipo : SOA
> Servidor primario: ns1.nameserverprimario.com.
> Correo: admin.dominio.com.
> Serial: 2013022101
> Refresh: 7200
> Retry: 540
> Expire: 7200
> TTL: 86400
>
> Estoy atascado con las regexp. De momento quiero separar cada elemento de la
> siguiente cadena "@       IN      SOA     ns1.nameserverprimario.com.
> admin.dominio.com."
>
> grupos =
> re.match('^([@]|[a-zA-z0-9\.]*\.)(\s+)IN(\s+)SOA(\s+)([@]|[a-zA-z0-9\.]*\.)(\s+)([@]|[a-zA-z0-9\.]*\.)','@
> IN      SOA     ns1.nameserverprimario.com. admin.dominio.com.')
> print(grupos.group())

Suponiendo que los distintos elementos aparecen siempre en la misma
posición, es bastante sencillo extraer la información por métodos más
directos usando el .split().

Con 're' en realidad es bastante sencillo. Podemos usar dos patrones:

#para detectar comentarios
comments=re.compile(";.*")

#para extraer los campos
pat_SOA=re.compile("""
    (?P<Zona>@)\W+
    IN\W+
    (?P<Tipo>SOA)\W+
    (?P<Servidor_primario>[\w\.]+\.)\W+
    (?P<Correo>[\w\.]+\.)\W+
    \(\W+
        (?P<Serial>\d+)\W+
        (?P<Refresh>\d+)\W+
        (?P<Retry>\d+)\W+
        (?P<Expire>\d+)\W+
        (?P<TTL>\d+)\W+
    \)
""",re.VERBOSE)


Lo he puesto en VERBOSE para que se vea mejor la separación entre campos.

Su uso:

cadena_limpia=comments.sub("", cadena)

print pat_SOA.groupdict(cadena_limpia)

Que sacaría un diccionario así:

{'Correo': 'admin.dominio.com.',
 'Expire': '604800',
 'Refresh': '7200',
 'Retry': '540',
 'Serial': '2013022101',
 'Servidor_primario': 'ns1.nameserverprimario.com.',
 'TTL': '86400',
 'Tipo': 'SOA',
 'Zona': '@'}






--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es