使用正则表达式从配置文件提取参数失败问题排查
解决配置文件主机名与状态提取问题
嘿,我看你遇到了正则匹配空结果的问题,咱们一步步来搞定它:
问题根源分析
你的代码现在返回空列表,主要有两个核心问题:
- 文件读取方式不对:你用
readlines()得到的是一个字符串列表,直接转成str后会带上列表的括号、引号这些额外符号,正则根本没法匹配原始的配置内容。 - 正则表达式逻辑不匹配实际格式:原正则试图在同一行匹配
<主机名>和active = ...,但你的配置里这两行是分开的,而且没有处理换行和空白的情况,自然匹配不到。
修正后的代码
直接替换你的filter.py内容试试:
#!/usr/bin/env python # coding=utf8 import re # 调整正则:匹配<主机名>后任意空白(含换行),再匹配active = 状态值 regexCfg = r"<(\w+)>\s*active\s*=\s*(\w+)" # 读取整个文件的原始文本,避免列表转字符串的格式干扰 with open("/etc/ansible/files/net_connect.cfg", 'r') as cfgfile: dataCfg = cfgfile.read() # 执行正则匹配 filteredCfg = re.findall(regexCfg, dataCfg, re.DOTALL) # 按期望格式输出结果 if filteredCfg: for hostname, status in filteredCfg: print(f"Hostname: {hostname}") print(f"Status: {status}") else: print("[RESULT] No matches found!")
关键修改点说明
- 文件读取:改用
read()直接获取整个文件的文本内容,保留原始的换行、空格格式,让正则能正确识别配置结构。 - 正则优化:
<(\w+)>:精准匹配由字母/数字/下划线组成的主机名标签(如果你的主机名有特殊字符,可以把\w+换成[^>]+来匹配除了>`之外的所有内容)。\s*:匹配任意数量的空白字符(包括换行、空格、制表符),解决两行内容的换行和缩进问题。active\s*=\s*:兼容active=yes、active = yes等不同的空格写法。(\w+):匹配状态值(比如yes),如果状态有特殊字符同样可以调整为[^ \n]+。
测试结果
运行修正后的代码,就能得到你期望的输出:
Hostname: SERVENFE Status: yes Hostname: SERVENFE2 Status: yes
内容的提问来源于stack exchange,提问作者Luis Henrique
相关产品推荐
相关产品推荐

