标记嵌套表达式,但忽略带空格的带引号的字符串

时间:2019-11-15 21:52:27

标签: python pyparsing

我希望漂亮地打印以下字符串

r"file='//usr/env/0/test/0', name='test', msg=Test.Msg(type=String, bytes_=Bytes(value=b\" 0\x80\x00\x00y\x17\`\"))"

    file='//usr/env/0/test/0',
    name='test',
    msg=Test.Msg(
        type=String,
        bytes=Bytes(
            value=b\" 0\x80\x00\x00y\x17\`\""
        )
    )

首先,我尝试使用pyparsing将输入标记化

from pyparsing import *
content = r"(file='//usr/env/0/test/0', name='test', msg=Test.Msg(type=String, bytes_=Bytes(value=b\" 0\x80\x00\x00y\x17\`\")))"
expr     = nestedExpr( '(', ')', ignoreExpr=None)
result = expr.parseString(content)
result.pprint()

这给了我一个嵌套列表,但是字节数组在空白处被分割了

[["file='//usr/env/0/test/0',",
  "name='test',",
  'msg=Test.Msg',
  ['type=String,',
   'bytes_=Bytes',
   ['value=b\\"', '0\\x80\\x00\\x00y\\x17\\`\\"']]]]

任何人都知道如何分隔逗号以返回以下内容吗?

[["file='//usr/env/0/test/0',",
  "name='test',",
  'msg=Test.Msg',
  ['type=String,',
   'bytes_=Bytes',
   ['value=b\\" 0\\x80\\x00\\x00y\\x17\\`\\"']]]]

1 个答案:

答案 0 :(得分:2)

要获得理想的结果,我们需要为嵌套表达式的内容定义一个内容表达式。默认内容是任何用引号引起来的字符串或空格分隔的单词。但我认为您的内容更像是一个逗号分隔的列表。

Pyparsing在pyparsing_common中定义了一个comma_separated_list表达式,但是在这里不起作用,因为它不知道嵌套表达式的from pyparsing import * content = r"""(file='//usr/env/0/test/0', name='test', msg=Test.Msg(type=String, bytes_=Bytes(value=b" 0\x80\x00\x00y\x17\`")))""" # slightly modified comma_separated_list from pyparsing_common commasepitem = ( Combine( OneOrMore( ~Literal(",") + Word(printables, excludeChars="(),") + Optional(White(" ") + ~FollowedBy(oneOf(", ( )"))) ) ) ) comma_separated_list = delimitedList(quotedString() | commasepitem) expr = nestedExpr( '(', ')', content=comma_separated_list) result = expr.parseString(content) result.pprint(width=60) print(result.asList() == [["file='//usr/env/0/test/0'", "name='test'", 'msg=Test.Msg', ['type=String', 'bytes_=Bytes', ['value=b" 0\\x80\\x00\\x00y\\x17\\`"']]]]) 不应成为逗号分隔列表中项目的一部分。因此,我们必须编写一个稍作修改的版本:

[["file='//usr/env/0/test/0'",
  "name='test'",
  'msg=Test.Msg',
  ['type=String',
   'bytes_=Bytes',
   ['value=b" 0\\x80\\x00\\x00y\\x17\\`"']]]]
True

打印:

{
    "api": {
      "target": "https://itunes.apple.com/search?term=drake",
      "secure": true,
      "changeOrigin": true
    }
}