首页 > 解决方案 > 使用正则表达式从配置文件中提取值

问题描述

我正在尝试读取配置文件并提取一些参数,这些是:

它们遵循标准的 XML 格式,其中主键(hostame)位于<hostname>以 My regex 结尾的值的内部和下方,<hostname/> 似乎像下面的示例一样工作,但是当我阅读dataCfg时没有收到任何值。

我在代码中输入的打印行只是为了查看是否返回了某些内容,但我想要的输出是注释的打印行#

过滤器.py

#!/usr/bin/env python
# coding=utf8
import re

# Strings regex
regexCfg = r"<(.*)>\n      active = (.*)"

# Get file .cfg
with open("/etc/ansible/files/net_connect.cfg", 'r') as cfgfile:
    dataCfg = cfgfile.readlines()

# Capture values
# Realize regex in string
filterdCfg = re.findall(regexCfg, str(dataCfg), re.MULTILINE)

# Print regex value
print("[RESULT] Row: {}".format(filterdCfg))
#print("Hostname: {}".format(filterdCfg[0][0]))
#print("Status: {}".format(filterdCfg[0][1]))

输出

[RESULT] Row: []

期望的输出

Hostname: SERVENFE
Status: yes
Hostname: SERVENFE2
Status: yes

数据文件

   <SERVENFE>
      active = yes
   <SERVENFE>
   <SERVENFE2>
      active = yes
   <SERVENFE2>

正则表达式示例

标签: python

解决方案


问题是.readlines()。这会将文件读入行列表。只需使用.read(),将其读入一个大字符串。IE

dataCfg = cfgfile.read()

输出:

[RESULT] Row: [('SERVENFE', 'yes'), ('SERVENFE2', 'yes')]

但是,正如评论中提到的,解析最终是更好的方法,尽管您的示例不是有效的 XML。


推荐阅读