gpt4 book ai didi

python - PyParsing 解析带有大括号和特定 header 的嵌套循环

转载 作者:太空宇宙 更新时间:2023-11-04 06:03:08 25 4
gpt4 key购买 nike

我找到了几个关于 pyparsing 的主题。他们在解析嵌套循环时处理几乎相同的问题,但即便如此,我也找不到解决我的错误的方法。

我有以下格式:

key value;
header_name "optional_metadata"
{
key value;
sub_header_name
{
key value;
};
};
key value;
  • 键是字母数字
  • Value 可以是 Int、String 类型,带字母数字 + "@._"
  • 键/值可以在大括号之后
  • 键/值可能在文件中第一个大括号 block 之前
  • 大括号前后的键/值是可选的
  • header 可以有一个名字
  • 右括号后跟一个分号

我使用了以下解析器:

VALID_KEY_CHARACTERS = alphanums
VALID_VALUE_CHARACTERS = srange("[a-zA-Z0-9_\"\'\-\.@]")

lbr = Literal( '{' ).suppress()
rbr = Literal( '}' ).suppress() + Literal(";").suppress()

expr = Forward()
atom = Word(VALID_KEY_CHARACTERS) + Optional(Word(VALID_VALUE_CHARACTERS))
pair = atom | lbr + OneOrMore( expr ) + rbr
expr << Group( atom + pair )

当我使用它时,我只得到“header_name”和“header_metadata”,我修改了它,我只得到了括号内的键/值,python 异常被触发以显示解析错误(它期望'}'当到达 sub_header_name 时。

任何人都可以帮助我理解为什么?谢谢。

最佳答案

我认为主要问题是你的语法没有完整描述输入,导致了一些不匹配。我看到的两个主要问题是您忘记了每个 key 对值都必须以分号结尾,并且没有指定 key 对值可以位于右花括号之后。它也看起来像以下几行:

pair = atom | lbr + OneOrMore( expr ) + rbr
expr << Group( atom + pair )

...将要求每组花括号至少包含两个键值对或一个键值对和一组花括号。我相信一旦遇到这些行,这会导致错误:

{
key value;
};

...在您的输入范围内,但我不完全确定。

无论如何,在玩弄了你的语法之后,我得到了这个:

from pyparsing import *

data = """key1 value1;
header_name "optional_metadata"
{
key2 value2;
sub_header_name
{
key value;
};
};
key3 value3;"""

# I'm reusing the key characters for the header names, which can contain a semicolon
VALID_KEY_CHARACTERS = srange("[a-zA-Z0-9_]")
VALID_VALUE_CHARACTERS = srange("[a-zA-Z0-9_\"\'\-\.@]")

semicolon = Literal(';').suppress()
lbr = Literal('{').suppress()
rbr = Literal('}').suppress()

key = Word(VALID_KEY_CHARACTERS)
value = Word(VALID_VALUE_CHARACTERS)

key_pair = Group(key + value + semicolon)("key_pair")
metadata = Group(key + Optional(value))("metadata")

header = key_pair + Optional(metadata)

expr = Forward()
contents = Group(lbr + expr + rbr + semicolon)("contents")
expr << header + Optional(contents) + Optional(key_pair)

print expr.parseString(data).asXML()

这导致以下输出:

<key_pair>
<key_pair>
<ITEM>key1</ITEM>
<ITEM>value1</ITEM>
</key_pair>
<metadata>
<ITEM>header_name</ITEM>
<ITEM>&quot;optional_metadata&quot;</ITEM>
</metadata>
<contents>
<key_pair>
<ITEM>key2</ITEM>
<ITEM>value2</ITEM>
</key_pair>
<metadata>
<ITEM>sub_header_name</ITEM>
</metadata>
<contents>
<key_pair>
<ITEM>key</ITEM>
<ITEM>value</ITEM>
</key_pair>
</contents>
</contents>
<key_pair>
<ITEM>key3</ITEM>
<ITEM>value3</ITEM>
</key_pair>
</key_pair>

我不完全确定这是否正是您想要完成的,希望它应该足够接近以便您可以调整它以适应您的特定任务。

关于python - PyParsing 解析带有大括号和特定 header 的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com