使用Regex提取设备hostname触发AttributeError报错解决方案
故障原因
抛出AttributeError: 'NoneType' object has no attribute 'group'的核心原因是re.search()没有匹配到符合规则的内容,返回了空值None,此时直接调用.group()方法就会触发异常。
匹配失败是因为正则的匹配逻辑和命令实际返回的内容顺序完全相反:
- 绝大多数网络设备执行
show run | include hostname返回的配置行格式为hostname 实际设备名,关键词hostname在前,设备名称在后 - 你写的正则
r'(\S+)\shostname'匹配的是「任意非空字符串 + 空格 + hostname」的结构,也就是要找xxx hostname格式的内容,和实际返回顺序颠倒,自然无法命中。
修复方法
调整正则匹配顺序,同时增加匹配失败的兜底判断,避免因设备返回格式差异导致脚本中断,修正后的代码如下:
# 获取hostname配置行 DEVICE_NAME = net_connect.send_command('show run | include hostname') # 修正正则:^锚定行首,匹配以hostname开头、后面跟空格+设备名的行,捕获组提取设备名 hostname_match = re.search(r'^hostname\s+(\S+)', DEVICE_NAME, re.M) if hostname_match: HOSTNAME = hostname_match.group(1) else: # 匹配失败时回退到之前show version的提取逻辑,做容错 version_output = net_connect.send_command('show version') HOSTNAME = re.search(r'(\S+)\suptime', version_output, re.M).group(1) print(HOSTNAME) # 原有地域配置逻辑保持不变 if re.search('ttreda.|tteu.+', HOSTNAME): TIMEZONE = 'GMT 0 0' SUMMERTIME = 'BST recurring' else: TIMEZONE = 'EST -5 0' SUMMERTIME = 'EDT recurring'
优化说明
- 正则增加
^锚定行首,可以避免配置中其他包含hostname字符串的无关行(比如snmp、ntp关联配置)造成误匹配 - 增加容错判断后,即使个别厂商/版本的设备返回格式有差异,也可以回退到原有逻辑提取hostname,不会直接崩溃
- 如果是华为、华三等使用
sysname配置主机名的厂商设备,只需要把正则里的hostname替换为sysname即可适配。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

