Python regex在字典列表的空格分隔键值块上

2024-09-30 18:18:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由空格分隔的键值字符串组成的大型多行文本,并使用===字符将其划分为块。 对于每个块,我想创建一个具有键值的字典

基本上,我发现自己更难编写正则表达式而不是创建字典,我使用这个r'^(\w+)\s*(.*)'来获取关键字和值,因为空格后面有什么,但我不知道如何通过===将文本分成块。 值显然是假的,但是,每个值都可能溢出到新行,如下面所示。你知道吗

见下文:

name                  jcento                                                                                                                                                                        
server_param          uptime=2,load=2, \                                                                                                                                                
                      mem=1,io=10
info_values           cpu=5,io=1,load=0, \                                                                                                                                    
                      core=8, mem=22724, \                                                                                                                                                         

info_value1           10                                                                                                                                                                                            
info_value2           banana                                                                                                                                                                                     
info_value3           NONE                                                                                                                                                                                         
projects              proj1 proj2 proj3 \
                      proj4

info_value5           NONE                                                                                                                                                                                         
info_value6           NONE                                                                                                                                                                                         
info_value7           NONE                                                                                                                                                                                         
info_value8           NONE                                                                                                                                                                                         
info_value9           NONE                                                                                                                                                                                      
================================================================================                                                                                                                                   
name                  jcento                                                                                                                                                                        
server_param          uptime=2,load=2, \                                                                                                                                                
                      mem=1,io=10
info_values           cpu=5,io=10,load=0, \                                                                                                                                                                                                                                                                               
                      core=8, mem=22724, \                                                                                                                                                         

info_value1           10                                                                                                                                                                                            
info_value2           banana                                                                                                                                                                                     
info_value3           NONE                                                                                                                                                                                         
projects              proj1 proj2 proj3 \
                      proj4

info_value5           NONE                                                                                                                                                                                         
info_value6           NONE                                                                                                                                                                                         
info_value7           NONE                                                                                                                                                                                         
info_value8           NONE                                                                                                                                                                                         
info_value9           NONE    

我希望输出是一个字典列表[{name:'jcento', server_param: 'uptime=2,load=2,mem=1,io=1', ...}, {name:'jcento5',....}]

另外,如果可能的话,要创建一个regex,该regex从key=value of name,value=value of projects生成字典,例如:

{jcento: 'proj1 proj2 proj3 proj4', jcento5: 'proj1 proj2 proj3 proj4'}。你知道吗

提前谢谢!你知道吗


Tags: nameioinfonone字典serverparamload
1条回答
网友
1楼 · 发布于 2024-09-30 18:18:20

如果我理解正确,您希望每个由“=============”边界分隔的部分在dict列表中是其唯一的dict。 您没有提供任何代码,但是看到您使用这个正则表达式来查找键/值对

r'^(\w+)\s*(.*)'

我假设您抓取这两个组并将它们各自的值作为newDict[match.group(1)] = match.group(2)传递

问题归结到如何读取数据。在这种方法中,我只需逐行读取文件,但由于您的值可以是多行的,因此我已经不确定您如何从您提供的regex中获得正确的分组。”(.*)“应该贪得无厌,回报你比你想要的多得多。你知道吗

如果所有的换行符都用“\”标记,您可以编写一个正则表达式来考虑这一点,如下所示: 将“(.*)”替换为“([\w,=]+(\s\\s)?[\w,=]+)?)”你知道吗

然而,我可能只是在读入文本文件时对其进行某些调整,以便在遍历它并使用以前的regex捕获之前,将所有数据点存储在一行中。 额外奖励: 您可以在迭代函数中添加与“==========”匹配的行,并在将旧字典添加到列表时初始化新字典。你知道吗

   import re
   final_list = []

   def makeDict(fl, data):
        kvPattern = re.compile(r'^(\w+)\s*(.*)')
        newDict = {}
        for line in data:
            if line.startswith("============="):
                fl.append(newDict)
                newDict = {}
            elif kvPattern.search(line):
                match = kvPattern.search(line)
                newDict[match.group(1)] = match.group(2)

        return fl

    final_list = makeDict(final_list, data)

如果你感到骄傲,你也可以用“else”代替“elif”。 或者更好的是,将整个过程包装在Try块中,以检查是否有任何数据点与您的regex模式不匹配

相关问题 更多 >