Вы правы, что re_match_iter_typed()
возвращает только первое совпадение, поэтому оно не подходит для этого приложения.
Я предлагаю что-то вроде этого:
- Найдите интерфейсный объект как обычно, используя
find_objects()
- Итерируйте по всем дочерним объектам интерфейсного объекта, используя атрибут
.children
- Использование
re_match_typed()
для каждого дочернего объекта (со значением по умолчанию, чтобы вы могли легко определить, соответствует ли вам адрес IPv6 или нет).
Пример кода ниже ...
import re
from ciscoconfparse.ccp_util import IPv6Obj
from ciscoconfparse import CiscoConfParse
CONFIG = """!
interface Vlan150
no ip proxy-arp
ipv6 address FE80:150::2 link-local
ipv6 address 2A01:860:FE:1::1/64
ipv6 enable
!
interface Vlan160
no ip proxy-arp
ipv6 address FE80:160::2 link-local
ipv6 address 2A01:870:FE:1::1/64
ipv6 enable
!"""
parse = CiscoConfParse(CONFIG.splitlines())
result = dict()
result['interfaces'] = dict()
for intf_obj in parse.find_objects(r'^interface'):
intf_name = re.split(r'\s+', intf_obj.text)[-1]
result['interfaces'][intf_name] = dict()
IPV6_REGEX = r'ipv6\s+address\s+(\S+)'
for val_obj in intf_obj.children:
val = val_obj.re_match_typed(IPV6_REGEX, result_type=IPv6Obj,
untyped_default=True, default='__not_addr__')
if val!='__not_addr__':
# Do whatever you like here...
print("{} {}".format(intf_name, val.compressed))
Запуск этого кода приводит к:
$ python try.py
Vlan150 fe80:150::2/128
Vlan150 2a01:860:fe:1::1/64
Vlan160 fe80:160::2/128
Vlan160 2a01:870:fe:1::1/64
$
Конечно, вы можете упаковать эти результаты в json, используя любую схему упаковки.
ЭтоТехника описана в документации, под Получить значения конфигурации