[Python] RE e dizionario

Marco Beri marcoberi a gmail.com
Mer 21 Dic 2016 00:06:23 CET


2016-12-20 21:58 GMT+01:00 Marcello <marcello a linuxvil.it>:

> Utilizzo paramiko per leggere una parte di configurazione di un router che
> memorizzo in una variabile.
> Il valore della variabile è:
>
> # dec/20/2016 21:09:12 by RouterOS 6.37.3
> # software id = X26E-3BA9
> #
> /ppp secret
> add local-address=10.172.33.1 name=nome1 password=passwd1 \
>     profile=profile-sstp remote-address=10.172.33.2 service=sstp
> add local-address=10.172.33.1 name=nome2 password=passwd2 profile=\
>     profile-ovpn remote-address=10.172.33.2 service=ovpn
> add local-address=10.172.34.37 name=nome3 password=passwd3 \
>     profile=profile-sstp remote-address=10.172.34.38 service=sstp
> add local-address=10.172.34.45 name=nome4 password=\
>     passwd4 profile=profile-sstp remote-address=10.172.34.46 service=\
>     sstp
> add local-address=10.172.34.49 name=nome5 password=passwd5 \
>     profile=profile-sstp remote-address=10.172.34.50 service=sstp
> add local-address=10.172.34.53 name=nome6 password=passwd6 \
>     profile=profile-sstp remote-address=10.172.34.54 service=sstp
>
>
> Devo creare un dizionario che contenga:
>
> name, remote-address, password
>
> ho già consumato le unghie con string.find e non so più dove aggrapparmi.
> Un idea potrebbe essere:
> prendi quello che è compreso tra 'name=' e 'password'
> prendi quello che è compreso tra 'password' e 'profile'
> ......
>
> seconda idea potrebbe essere string.split ed andare a fare un if su ogni
> parola, se comincia con name=xxxxx taglia 5 caratteri iniziali.
> Magari funziona, ma penso di sprecare troppe risorse di CPU.
>
> Penso che il metodo migliore siano le espressioni regolari.... ma la mia
> testa ha poca RAM e il programma per caricale non gira.  :)
> Qualche dritta su come poter procedere?
> Grazie 1000 anche solo per aver letto fino a qui.
>

Questa riga qui sotto, ammettendo di avere la variabile conf che contiene
tutta la tua stringa con la configurazione fa, credo, quello che chiedi:

config = [dict([(param.split("=")) for param in host.split(" ") if "=" in
param]) for host in conf.split("add ")[1:]]


Non è il massimo della leggibilità, ma di sicuro è veloce e usa solo split
e list comprehension :-)

Il valore di config è un elenco di dizionari siffatto:

[{'local-address': '10.172.33.1',
  'name': 'nome1',
  'password': 'passwd1',
  'profile': 'profile-sstp',
  'remote-address': '10.172.33.2',
  'service': 'sstp\n'},
 {'local-address': '10.172.33.1',
  'name': 'nome2',
  'password': 'passwd2',
  'profile': '',
  'remote-address': '10.172.33.2',
  'service': 'ovpn\n'},
 {'local-address': '10.172.34.37',
  'name': 'nome3',
  'password': 'passwd3',
  'profile': 'profile-sstp',
  'remote-address': '10.172.34.38',
  'service': 'sstp\n'},
 {'local-address': '10.172.34.45',
  'name': 'nome4',
  'password': '',
  'profile': 'profile-sstp',
  'remote-address': '10.172.34.46',
  'service': ''},
 {'local-address': '10.172.34.49',
  'name': 'nome5',
  'password': 'passwd5',
  'profile': 'profile-sstp',
  'remote-address': '10.172.34.50',
  'service': 'sstp\n'},
 {'local-address': '10.172.34.53',
  'name': 'nome6',
  'password': 'passwd6',
  'profile': 'profile-sstp',
  'remote-address': '10.172.34.54',
  'service': 'sstp'}]


Certo, ogni dizionario ha più roba di quello che ti serve, ma è un vero
problema?

Se lo è, devi correggere if "=" in param con if param.split("=")[0] in
("name", "remote-address", "password")

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
http://beri.it/articoli/ - Qualche articolo
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20161221/37b75efb/attachment.html>


Maggiori informazioni sulla lista Python