#python-3.x #network-programming #text-parsing
Вопрос:
Проходя через ttp (анализатор текста шаблона), я наткнулся на функцию поиска в переменных и группах соответствия. Там упоминается, что мы можем использовать поиск по предыдущим переменным шаблона, но даже пример кода не даст надлежащих результатов в моем компиляторе.
from ttp import ttp template = ''' lt;template name="interfaces"gt; lt;input load="text"gt; interface FastEthernet2.13 description Customer CPE interface ip address 10.12.13.1 255.255.255.0 vrf forwarding CPE-VRF ! interface GigabitEthernet2.13 description Customer CPE interface ip address 10.12.14.1 255.255.255.0 vrf forwarding CUST1 ! lt;/inputgt; lt;group name="{{ interface }}"gt; interface {{ interface }} description {{ description | ORPHRASE }} ip address {{ subnet | PHRASE | to_ip | network | to_str }} vrf forwarding {{ vrf }} lt;/groupgt; lt;/templategt; lt;template name="arp"gt; lt;input load="text"gt; Protocol Address Age (min) Hardware Addr Type Interface Internet 10.12.13.2 98 0950.5785.5cd1 ARPA FastEthernet2.13 Internet 10.12.14.3 131 0150.7685.14d5 ARPA GigabitEthernet2.13 lt;/inputgt; lt;group lookup="interface, template='interfaces', update=True"gt; Internet {{ ip }} {{ age | DIGIT }} {{ mac }} ARPA {{ interface }} lt;/groupgt; lt;/templategt; ''' parser = ttp() parser.add_template(template) parser.parse() print(parser.result(format = "json")[0])
Это должно дать мне результат, как показано ниже, но я не получаю часть «ВЫВОД ТАБЛИЦЫ ARP», как указано в приведенном ниже коде (на самом деле мы используем поиск) :-
[[{'FastEthernet2.13': {'description': 'Customer CPE interface', 'subnet': '10.12.13.0/24', 'vrf': 'CPE-VRF'}, 'GigabitEthernet2.13': {'description': 'Customer CPE interface', 'subnet': '10.12.14.0/24', 'vrf': 'CUST1'}}], [[{'age': '98', ## ARP TABLE OUTPUT 1 'description': 'Customer CPE interface', 'interface': 'FastEthernet2.13', 'ip': '10.12.13.2', 'mac': '0950.5785.5cd1', 'subnet': '10.12.13.0/24', 'vrf': 'CPE-VRF'}, {'age': '131', ## ARP TABLE OUTPUT 2 'description': 'Customer CPE interface', 'interface': 'GigabitEthernet2.13', 'ip': '10.12.14.3', 'mac': '0150.7685.14d5', 'subnet': '10.12.14.0/24', 'vrf': 'CUST1'}]]]
Любая помощь будет признательна.
Комментарии:
1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Запуск вашего шаблона с помощью TTP 0.8.0 дает мне результат, который вы ожидали:
from ttp import ttp import pprint def test_lookup_crosstemplates(): template = """ lt;template name="interfaces"gt; lt;input load="text"gt; interface FastEthernet2.13 description Customer CPE interface ip address 10.12.13.1 255.255.255.0 vrf forwarding CPE-VRF ! interface GigabitEthernet2.13 description Customer CPE interface ip address 10.12.14.1 255.255.255.0 vrf forwarding CUST1 ! lt;/inputgt; lt;group name="{{ interface }}"gt; interface {{ interface }} description {{ description | ORPHRASE }} ip address {{ subnet | PHRASE | to_ip | network | to_str }} vrf forwarding {{ vrf }} lt;/groupgt; lt;/templategt; lt;template name="arp"gt; lt;input load="text"gt; Protocol Address Age (min) Hardware Addr Type Interface Internet 10.12.13.2 98 0950.5785.5cd1 ARPA FastEthernet2.13 Internet 10.12.14.3 131 0150.7685.14d5 ARPA GigabitEthernet2.13 lt;/inputgt; lt;group lookup="interface, template='interfaces', update=True"gt; Internet {{ ip }} {{ age | DIGIT }} {{ mac }} ARPA {{ interface }} lt;/groupgt; lt;/templategt; """ parser = ttp() parser.add_template(template) parser.parse() res = parser.result() # pprint.pprint(res) assert res == [[{'FastEthernet2.13': {'description': 'Customer CPE interface', 'subnet': '10.12.13.0/24', 'vrf': 'CPE-VRF'}, 'GigabitEthernet2.13': {'description': 'Customer CPE interface', 'subnet': '10.12.14.0/24', 'vrf': 'CUST1'}}], [[{'age': '98', 'description': 'Customer CPE interface', 'interface': 'FastEthernet2.13', 'ip': '10.12.13.2', 'mac': '0950.5785.5cd1', 'subnet': '10.12.13.0/24', 'vrf': 'CPE-VRF'}, {'age': '131', 'description': 'Customer CPE interface', 'interface': 'GigabitEthernet2.13', 'ip': '10.12.14.3', 'mac': '0150.7685.14d5', 'subnet': '10.12.14.0/24', 'vrf': 'CUST1'}]]] test_lookup_crosstemplates()
Любопытно, какую версию TTP вы используете, групповые запросы, введенные начиная с версии 0.4.0.
Если это не проблема здесь, пожалуйста, поделитесь примером результатов анализа, полученных вами от TTP, вместе с точным шаблоном и образцом данных в дополнение к ожидаемым результатам, которыми вы уже поделились изначально.
Комментарии:
1. Да, спасибо, чувак, на самом деле список «результат» здесь имеет индекс 0,1, и я печатал только первый (как это было по умолчанию в коде, приведенном в документации ttp). Спасибо за ответ :). Он работает должным образом.