python - 在python中将部分字符串转换为变量名

标签 python regex server

我有一个包含如下文本的文件:

loadbalancer {
upstream application1 {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
server 127.0.0.1:8084;
}
upstream application2 {
server 127.0.0.1:8092;
server 127.0.0.1:8093;
server 127.0.0.1:8094;
}
}

有谁知道,我怎样才能提取如下变量:

appList=["application1","application2"]
ServerOfapp1=["127.0.0.1:8082","127.0.0.1:8083","127.0.0.1:8084"]
ServerOfapp2=["127.0.0.1:8092","127.0.0.1:8093","127.0.0.1:8094"]

.
.
.

等等

最佳答案

如果您想要的行始终以上游和服务器开头,这应该可行:

app_dic = {}
with open('file.txt','r') as f:
    for line in f:
        if line.startswith('upstream'):
            app_i = line.split()[1]
            server_of_app_i = []
            for line in f:
                if not line.startswith('server'):
                    break
                server_of_app_i.append(line.split()[1][:-1])
            app_dic[app_i] = server_of_app_i

app_dic 应该是一个列表字典:

{'application1': ['127.0.0.1:8082', '127.0.0.1:8083', '127.0.0.1:8084'],
'application2': ['127.0.0.1:8092', '127.0.0.1:8093', '127.0.0.1:8094']}

编辑

如果输入文件不包含任何换行符,只要文件不是太大,您就可以将其写入列表并对其进行迭代:

app_dic = {}
with open('file.txt','r') as f:
   txt_iter = iter(f.read().split()) #iterator of list
for word in txt_iter:
    if word == 'upstream':
        app_i = next(txt_iter)
        server_of_app_i=[]
        for word in txt_iter:
            if word == 'server':
                server_of_app_i.append(next(txt_iter)[:-1])
            elif word == '}':
                break
        app_dic[app_i] = server_of_app_i

这更难看,因为必须搜索结束的大括号才能断开。如果变得更复杂,则应使用正则表达式。

关于python - 在python中将部分字符串转换为变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726825/

相关文章:

python - Python 的机器人框架关键字 : Error with unmatched string or IP. 如何解决此问题?

javascript - 正则表达式来匹配 javascript 函数的定义并确保它返回一些东西?

c# - 如何通过这段代码匹配以 "أقول "开头的句子?

python - 你应该用 wsgi 部署 django 吗?

windows - 通过 .bat 在已经打开的 CMD 中插入命令

python - python中文件之间的矩阵相乘

Python - 在值与另一列匹配的相应列中返回值

C# TCP 服务器模拟

python - 在 BeautifulSoup 中用字典解析脚本标签

python - 如何在 Python 后向断言正则表达式 (?<=\\) 中使用 '\' 来匹配类似 C++ 的带引号字符串