您好,我们有一些自定义应用程序,其配置文件如下所示:
application{
rules{
a{
role admin
permission write
}
}
config{
settings{
file name.txt
parameters{
id 1234
hash-size 4096
}
}
}
}
我只是想找出一种方法来解析此内容,并且只获取config部分,因此不需要其他所有内容。我什至不知道如何开始像这样解析文件。任何帮助将不胜感激。
答案 0 :(得分:1)
对于“快捷方式”解决方案,您可以将配置文件转换为类似于XML的文件,然后使用BeautifulSoup对其进行解析。但是如果配置文件的语法足够复杂,我会使用其他解决方案(例如,像注释中的PyParsing):
data = '''application{
rules{
a{
role admin
permission write
}
}
config{
settings{
file name.txt
parameters{
id 1234
hash-size 4096
}
}
}
}'''
from bs4 import BeautifulSoup
import re
data = re.sub(r'([a-z]+)\{', r'<t data="\1">', data)
data = re.sub(r'\}', r'</t>', data)
data = re.sub(r'^[^\w]+([^\s]+)\s([a-z\d\-\.]+)\n', r'<parameter name="\1">\2</parameter>', data, flags=re.M)
soup = BeautifulSoup(data, 'lxml')
settings = soup.select_one('t[data="config"]').select_one('t[data="settings"]')
print('File: {}'.format(settings.parameter.text))
print('Parameters:')
for p in settings.select('t[data="parameters"] > parameter'):
print('name={} value={}'.format(p['name'], p.text))
打印:
File: name.txt
Parameters:
name=id value=1234
name=hash-size value=4096
答案 1 :(得分:0)
这是构造json字符串的方法。
data = '''application{
rules{
a{
role admin
permission write
}
}
config{
settings{
file name.txt
parameters{
id 1234
hash-size 4096
}
}
}
}'''
def to_dict(data):
data_list = ['{']
for line in data.splitlines():
line = line.strip()
if line.endswith('{'):
data_list.append('"' + line.replace('{', '": {'))
elif line == '}':
data_list.append(line + ',')
elif ' ' in line:
tokens = line.split(' ')
data_list.append('"%s": "%s",' % (tokens[0], tokens[1]))
data_list.append('}')
import json
data_str = ''.join(data_list).replace('",}', '"}')
while '},}' in data_str:
data_str = data_str.replace('},}', '}}')
return json.loads(data_str)
print(to_dict(data))