python - 使用正则表达式从配置文件中提取值
问题描述
我正在尝试读取配置文件并提取一些参数,这些是:
- 主机名
- 状态(活动)
它们遵循标准的 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>
解决方案
问题是.readlines()
。这会将文件读入行列表。只需使用.read()
,将其读入一个大字符串。IE
dataCfg = cfgfile.read()
输出:
[RESULT] Row: [('SERVENFE', 'yes'), ('SERVENFE2', 'yes')]
但是,正如评论中提到的,解析最终是更好的方法,尽管您的示例不是有效的 XML。
推荐阅读
- python - Pyrebase 如何系统地访问多个键并打印它们的子数据?
- django - 如何使用 Fk 设置 Boolean = True 每个模型的唯一性
- .net - 在 Asp.Net Web 应用程序中使用 Okta 时,OpenIdConnectProtocolValidationContext.Nonce 为空
- python - 修改 Genbank 文件
- docker - Azure 规模集 VMS 使用 Docker 映像
- sql-server - 由于并发连接器关闭或重新启动,无法向源数据库提交已处理的日志位置
- ios - 如何在 iOS 中管理项目和框架之间的公共依赖关系
- java - 带有参数的 Spring Data 本机查询不起作用
- python - 从数据中的现有标准列添加标准偏差条?
- css - 无法在左侧滚动带有 flex 的居中 img