我正在使用Ansible和TextFSM(Python)模板从网络设备动态提取LLDP信息,然后将LLDP输出应用于相同的设备接口说明。我目前有一个工作模型,但是我需要微调写到接口描述中的内容,以匹配我们的命名约定(主机名接口),其中主机名不能包含FQDN,并且接口应该是接口的前三个字母大小写(在这种情况下为“ eth”),其后紧跟接口号(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 +)准确地捕获本地接口(Et1),然后当我尝试仅使用^ [^。] +捕获主机名时,我还将包括本地接口输出“ 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 --> ?
将要写入设备接口描述的所需最终结果看起来像“ lab-fr-sw01-eth24”。但是,因为我们有多个站点,并且每个站点名称都包含在主机名中,所以我不能依靠尝试逐个字母地匹配主机名。
答案 0 :(得分:1)
我猜这里我们希望捕获字符串的三个部分,我们可以使用一个简单的表达式来捕获它,例如:
([a-z0-9]+)\s+([\w\-\.]+)\s([a-z0-9]+)\s([0-9]+)
我们期望的输出位于#1
,#2
和#3
组中,这里我们还应用了i
标志。
# 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.
jex.im可视化正则表达式:
要捕获test.local
,我们只需从字符列表中删除.
:
([a-z0-9]+)\s+([\w\-]+)(.+?)\s([a-z0-9]+)\s([0-9]+)