【问题标题】:python: how to parse string of values like "a = 'abc' b = 'cde' c=13"python:如何解析诸如“a = 'abc' b = 'cde' c=13”之类的字符串
【发布时间】:2016-01-24 23:07:25
【问题描述】:

基本上,如果我有一个像"a = 'abc' b = 'cde' c=13" 这样的字符串,我该如何将它解析成一个字典:

{'a': 'abc', 'b': 'cde', 'c': 13}

请注意,值可以是字符串文字或数字,并且字符串文字本身可以包含等号。字符串文字之外的空格是无关紧要的,里面的空格必须保留。不过,该字符串保证在 key=value key=value key=value 模式中交替出现。特殊字符可以并且将会出现在字符串文字中,但键将是纯字母字符。

【问题讨论】:

  • 所以可能是"a = 'abc' b = 'cde' c=13 d='asd=123'" ?
  • 值可以包含空格吗? ('abc def' 是一个有效值)转义引号呢? ('abc\'def' 有效)
  • 我猜两个单引号之间的任何东西都必须被视为一个值。但是 OP 应该真正定义有效输入的规则,以便更好地获得任何体面的答案。示例输入和预期输出的列表也很好
  • 是的,引号内的任何内容都必须保留。这包括'='、'\''、''等。
  • @kelvinsong 你应该从那个描述开始。没有理由不能解析单个标签。如果它不起作用,那么这是关于 xml/html 解析器使用的另一个问题。在这种情况下,手工制作的解析器将不符合您的需求。对于这种情况,您还需要解析 xml 实体。

标签: python string-parsing


【解决方案1】:

使用 pyparsing:

from pyparsing import Word, Suppress, CharsNotIn, nums, alphanums, dictOf

int_value = Word(nums)
str_value = Suppress("'") + CharsNotIn("'") + Suppress("'")
value = int_value | str_value
identifier = Word(alphanums)
result = dictOf(identifier + Suppress("="), value)

pr = result.parseString("a = 'abc' b = 'cde' c=13")
print(pr.asDict())

# {'a': 'abc', 'b': 'cde', 'c': '13'}

这不考虑转义的单引号,因此您必须添加它。在 pyparsing 网站上的某处有关于它的文档。

【讨论】:

  • 这适用于字符串文字只是单引号或双引号,但不是混合的情况。所以"a=\"abc\" b='cde'" 失败了
  • 1.问题中没有提到"。 2. 这是一个示例解决方案 - 您可以轻松扩展它以支持双引号和引号转义 - 查看 pyparsing 文档了解如何做到这一点
  • 这段代码实际上不起作用,就像前面三个答案一样。
  • @TigerhawkT3 您必须发布具体错误 - 此处提供的代码可以正常工作。
  • 正如上面所说的 OP,它因混合引用类型而失败。由于问题指定了字符串文字和特殊字符,因此它应该能够处理。
猜你喜欢
  • 2021-04-09
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2022-11-09
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多