[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