【问题标题】:python dictionary conversion from string?python字典从字符串转换?
【发布时间】:2011-02-16 18:07:33
【问题描述】:

如果我有类似的字符串

"{ partner_name = test_partner}" OR " { partner_name : test_partner }

它的示例字符串将非常复杂,包含几个特殊字符,例如 =、[、]、{、}

将它转换为 python 对象的最佳方法是什么 - 这样我就可以处理它

我尝试使用 eval 但它需要“'”作为字符串,但是我们如何在每个单词的开始和结束之前添加这个特殊字符 \',我尝试了正则表达式 re.findal('\w+') 但它失败了当我的字符串包含'_'或类似字符时,它将用'_'分隔字符串

这个问题的对象是我的应用程序需要,用户友好的语言作为输入 - 我认为 Json Dict 会很好 - 但用户懒惰在每个字符串的前后放置“'”......

然后我想到了 yaml,但它也很复杂,如果有人可以建议我用作 python 对象的更好的用户友好输入 - 那么请帮助我。

【问题讨论】:

    标签: python serialization eval yaml dictionary


    【解决方案1】:

    如果是一些外部数据,不要在上面使用eval()!如果您想正确解析它,请查看一些解析库。使用解析组合器的那些非常好 - 例如https://github.com/pyparsing/pyparsing 或者可能是一个 peg 解析器:http://fdik.org/pyPEG/

    【讨论】:

    【解决方案2】:

    您可以替换或删除任何不需要的字符

    >>> s
    '{ partner_name = test_partner }'
    >>> s = ''.join([c for c in s.replace('=', ':') if not c in '\ {}'])
    >>> s
    'partner_name:test_partner'
    

    然后将字符串一分为二创建一个字典

    >>> dict([s.split(':')])
    {'partner_name': 'test_partner'}
    

    或更新

    >>> your_dict.update([s.split(':')])
    

    【讨论】:

      【解决方案3】:
      >>> import ast
      
      >>> ast.literal_eval("{ 'partner_name' : 'test_partner' }")
      {'partner_name': 'test_partner'}
      

      copied from

      编辑

      你可以使用regular expressions

      >>> import re
      >>> m = re.match(r"(?P<partner_name>\w+) = (?P<test_partner>\w+)", "foo = bar")
      >>> m.groupdict()
      {'partner_name': 'foo', 'test_partner': 'bar'}
      >>> 
      

      【讨论】:

      • literal_eval 它只是一个安全的 eval 版本,我的问题仍然是问题,用户不想在单词的每个开头和结尾都加上刺痛文字。
      【解决方案4】:

      如果 YAML 对您的用户来说过于复杂,您或许应该考虑为他们提供结构化输入表单并从那里正确格式化数据。 YAML 非常容易编写来指定结构,当然比花括号语法更容易。

      【讨论】:

        【解决方案5】:

        修复输入将是最好的解决方案。

        但是你可以跳过一系列的圈子,试图通过json 输入parsable。这很脆弱,因为您的输入不完全是 json,并且不同的输入很容易破坏这一点(尽管它仍然是 imo 优于 eval 的平淡使用)。

        >>> import json
        >>> s = '{ partner_name = test_partner}'
        >>> t = s.replace(' ', '') # strip whitespace
        >>> t = t.replace('=', '":"')
        >>> t = t.replace('{','{"')
        >>> t = t.replace('}','"}')
        >>> json.loads(t)
        {u'partner_name': u'test_partner'}
        

        【讨论】:

          猜你喜欢
          • 2018-05-19
          • 2013-03-13
          • 2017-03-23
          • 1970-01-01
          • 1970-01-01
          • 2020-11-17
          • 1970-01-01
          • 2013-02-03
          • 1970-01-01
          相关资源
          最近更新 更多