0
我想解析一個Nagios/Icinga配置,所以我可以用Python對它進行進一步處理。由於我找不到工作庫來做到這一點(pynag似乎根本無法工作),我正在嘗試使用正則表達式編寫一個簡單的Python腳本。用Python解析Nagios/Icinga配置正則表達式
基本上我想從這個CONFIGFILE得到(它使用縮進選項卡):
define host {
address 123.123.123.123
passive_checks_enabled 1
}
define service {
service_description Crondaemon
check_command check_nrpe_1arg!check_crondaemon
}
到像這樣的Python元組:
(
('host', ('address', '123.123.123.123'), ('passive_checks_enabled', '1')),
('service', ('service_description', 'Crondaemon'), ('check_command', 'check_nrpe_1arg!check_crondaemon'))
)
這是我與分析邏輯完整的腳本,包括一個例子來測試:
import re
# white spaces are tabs!
TEST_STR = """
define host {
address 123.123.123.123
passive_checks_enabled 1
}
define service {
service_description Crondaemon
check_command check_nrpe_1arg!check_crondaemon
}
"""
cfg_all_regex = re.compile(
r'define\s+(\w+)\s*\{'
'(.*?)'
'\t}',
re.DOTALL
)
# basic regex works
print(re.findall(cfg_all_regex, TEST_STR))
cfg_all_regex = re.compile(
r'define\s+(\w+)\s*{\n'
'(\t(.*)?\t(.*)?\n)*'
'\t}',
re.DOTALL
)
# more specific regex to extract all key values fails
print(re.findall(cfg_all_regex, TEST_STR))
不幸的是,我不能得到完整的解析工作,它總是匹配一切或沒有。 你能給我一個提示如何修復我的正則表達式,所以我可以從我的Icinga配置中提取所有的鍵值對嗎?
哇,沒想到這不能用簡單的正則表達式解決。但是你的解決方案就像一個魅力,我可以完成我的解析器。最終的邏輯可以在這裏找到:https://gist.github.com/ifischer/6e8aa105c5f644fd3803f8b41dcbe4f3 非常感謝你的幫助,節省了我很多時間擺弄! – ifischer
剛剛發現[regex](https://pypi.python.org/pypi/regex/)支持重複捕獲。也許這個解決方案可以簡化很多。但現在不值得努力 – ifischer
你是對的。如果在項目中安裝第三方庫是可行的,則正則表達式模塊是更好的選擇。 – alvarez