【问题标题】:turn key="value" string into a dict将 key="value" 字符串转换为字典
【发布时间】:2014-06-07 08:16:43
【问题描述】:

我有一个格式如下的字符串:

author="PersonsName" date="1183050420" format="1.1" version="1.2"

我想把它变成一个 Python dict,一个 la:

{'author': 'PersonsName', 'date': '1183050420', 'format': '1.1', 'version': '1.2'}

我曾尝试在字符串上使用 re.split 这样做:

attribs = (re.split('(=?" ?)', twikiattribs))

我想我会得到一个类似的列表:

['author', 'PersonsName', 'date', '1183050420', 'format', '1.1', 'version', '1.2']

然后我可以变成一个字典,但我得到的是:

['author', '="', 'PersonsName', '" ', 'date', '="', '1183050420', '" ', 'format', '="', '1.1', '" ', 'version', '="', '1.2', '"', '']

所以,在我进一步遵循 re.split 行之前,通常是否有更好的方法来实现我想要做的事情,和/或如果解决方案涉及 re.split,我该如何编写一个正则表达式拆分任何字符串=""_(其中“_”是空格字符)或只是",只生成一个包含奇数索引中的键和偶数索引中的值的列表?

【问题讨论】:

    标签: python regex python-2.7 dictionary


    【解决方案1】:

    使用re.findall():

    dict(re.findall(r'(\w+)="([^"]+)"', twikiattribs))
    

    re.findall(),当呈现具有多个捕获组的模式时,返回一个元组列表,每个嵌套元组包含捕获的组。 dict() 高兴地接受该输出并将每个嵌套元组解释为键值对。

    演示:

    >>> import re
    >>> twikiattribs = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'
    >>> re.findall(r'(\w+)="([^"]+)"', twikiattribs)
    [('author', 'PersonsName'), ('date', '1183050420'), ('format', '1.1'), ('version', '1.2')]
    >>> dict(re.findall(r'(\w+)="([^"]+)"', twikiattribs))
    {'date': '1183050420', 'format': '1.1', 'version': '1.2', 'author': 'PersonsName'}
    

    re.split() 的行为也因捕获组而异;如果分组,您拆分的文本将包含在输出中。比较有和没有捕获组的输出:

    >>> re.split('(=?" ?)', twikiattribs)
    ['author', '="', 'PersonsName', '" ', 'date', '="', '1183050420', '" ', 'format', '="', '1.1', '" ', 'version', '="', '1.2', '"', '']
    >>> re.split('=?" ?', twikiattribs)
    ['author', 'PersonsName', 'date', '1183050420', 'format', '1.1', 'version', '1.2', '']
    

    不过,re.findall() 输出更容易转换为字典。

    【讨论】:

    • 谢谢,@MartjinPieters!我已经接受了答案,但必须再等 5 分钟......
    【解决方案2】:

    问题是您在正则表达式中包含括号,这会将其转换为捕获的组并将其包含在拆分中。像这样分配attribs

    attribs = (re.split('=?" ?', twikiattribs))
    

    它会按预期工作。这确实会返回一个空白字符串(由于输入字符串中的最后一个"),因此您在创建字典时需要使用attribs[:-1]

    【讨论】:

      【解决方案3】:

      你也可以在一行中不使用re

      >>> data = '''author="PersonsName" date="1183050420" format="1.1" version="1.2"'''
      >>> {k:v.strip('"') for k,v in [i.split("=",1) for i in data.split(" ")]}
      {'date': '1183050420', 'format': '1.1', 'version': '1.2', 'author': 'PersonsName'}
      

      如果值中允许有空格,则可以使用此行:

      >>> {k:v.strip('"') for k,v in [i.split("=",1) for i in data.split('" ')]}
      

      【讨论】:

      • 当然,这假定值中永远不会有 '='' ' 字符。
      • i.split("=", 1) 解决了第一个问题。当然,值中的空格更难克服。
      • 谢谢。你是对的。根据PersonName 的格式,似乎不应该存在空格,但我会尝试修复它。
      • 我解决了这个问题。
      【解决方案4】:

      我个人解析它的方式:

      import shlex
      
      s = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'
      
      dict(x.split('=') for x in shlex.split(s))
      Out[12]: 
      {'author': 'PersonsName',
       'date': '1183050420',
       'format': '1.1',
       'version': '1.2'}
      

      【讨论】:

        【解决方案5】:

        试试

        >>> str = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'
        >>> eval ('dict(' + str.replace(" ",",") + ')')
        {'date': '1183050420', 'format': '1.1', 'version': '1.2', 'author': 'PersonsName'}
        

        假设前面的值没有空格。

        但请注意使用eval()。有趣的输入可能会发生坏事。不要在用户输入中使用它。

        【讨论】:

          【解决方案6】:

          非正则表达式列表理解单行:

          >>> s = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'
          
          >>> print dict([tuple(x.split('=')) for x in s.split()])
          {'date': '"1183050420"', 'format': '"1.1"', 'version': '"1.2"', 'author': '"PersonsName"'}
          

          【讨论】:

            【解决方案7】:

            这可能会帮助其他一些 re.findall() 没有的人。

            # grabbing input
            input1 = dict,list,ect
            
            # creating a phantom variable
            Phantom = 'variable_name =  ' + input1
            
            # executing the phantom
            phenomenon = exec(Phantom)
            
            # storing the phantom variable in a live one
            output = variable_name
            
            # printing the stored phantom variable
            print(output)
            

            它的本质是在您的输入中添加一个变量名并创建该变量。

            例如,如果您的列表返回为“[[1,2][list][3,4]]”,则执行为 variable_name = [[1,2][list][3,4]]

            在其中激活它的原始功能。

            它确实会产生 PEP 8 错误,因为变量在运行之前不存在。

            【讨论】:

              猜你喜欢
              • 2020-07-21
              • 2016-12-14
              • 1970-01-01
              • 1970-01-01
              • 2016-04-17
              • 2014-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多