gpt4 book ai didi

python - 如何使用正则表达式(TextFSM 模板)单独匹配单行 CLI 输出 (LLDP) 的三个独立部分

转载 作者:行者123 更新时间:2023-12-01 07:45:30 42 4
gpt4 key购买 nike

我正在使用 Ansible 和 TextFSM (Python) 模板从网络设备动态提取 LLDP 信息,然后将 LLDP 输出应用到相同的设备接口(interface)描述。我目前有一个工作模型,但是我需要微调写入接口(interface)描述的内容,以匹配我们的命名约定(主机名-接口(interface)),其中主机名不能包含 FQDN,并且接口(interface)应该是下部接口(interface)的前三个字母case(本例中为“eth”)后面紧跟接口(interface)编号 (24)。最终结果看起来像“lab-fr-sw01-eth24”

我可以使用 (\S+) 为模板中的每个变量提取适当的输出:

Value NEIGHBOR (\S+)
Value LOCAL_INTERFACE (\S+)
Value NEIGHBOR_INTERFACE (\S+)

CLI 输出示例:et1 lab-fr-sw01.test.local以太网24 120

唯一的问题是,有时交换机会像上面那样为“NEIGHBOR”变量提取 FQDN,有时却不会。现在我正在尝试为每个变量编写一个特定的正则表达式(TextFSM 模板仅使用正则表达式)语句。对于邻居变量,我尝试将第二个非空白字符匹配到“.”。如果存在的话。到目前为止,我只能使用 (^\S+) 准确获取本地接口(interface) (Et1),然后当我尝试使用 ^[^.]+ 仅获取主机名时,我还包括本地接口(interface)输出“Et1”。为了匹配,我一直在使用 https://regex101.com

Et1 lab-fr-sw01.test.local以太网24 120

Where LOCAL_INTERFACE = Et1, --> (^\S+)
NEIGHBOR = lab-ew-sw01.test.local and --> ^[^.]+
NEIGHBOR_INTERFACE = Ethernet24 --> ?

写入设备接口(interface)描述的所需最终结果将类似于“lab-fr-sw01-eth24”。但是,因为我们有多个站点,并且每个站点名称都包含在主机名中,所以我不能依赖尝试逐个字母匹配主机名。

最佳答案

我猜测这里我们希望捕获字符串的三个部分,我们可以使用一个简单的表达式来实现,例如:

([a-z0-9]+)\s+([\w\-\.]+)\s([a-z0-9]+)\s([0-9]+)

Demo 1

我们想要的输出位于#1#2#3组中,这里我们还应用了标志。

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([a-z0-9]+)\s+([\w\-\.]+)\s([a-z0-9]+)\s([0-9]+)"

test_str = "Et1 lab-fr-sw01.test.local Ethernet24 120"

subst = "LOCAL_INTERFACE = \\1\\nNEIGHBOR = \\2\\nNEIGHBOR_INTERFACE = \\3"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE | re.IGNORECASE)

if result:
print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Demo

正则表达式电路

jex.im可视化正则表达式:

enter image description here

编辑

为了捕获test.local,我们只需从我们的字符列表中删除.:

([a-z0-9]+)\s+([\w\-]+)(.+?)\s([a-z0-9]+)\s([0-9]+)

Demo 2

关于python - 如何使用正则表达式(TextFSM 模板)单独匹配单行 CLI 输出 (LLDP) 的三个独立部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480906/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com