我希望漂亮地打印以下字符串
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\\`\\"']]]]
答案 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
}
}