如果某个结构嵌套在另一种类型的结构中,我无法找到忽略该结构的方法。在下面的示例中,我有一个正在尝试解析的 Structure_a,但在我的结果中,我还获得了嵌套在另一个结构中的 Structure_a 的匹配项。我不希望 pyparsing 匹配那些,除非我首先匹配外部结构。我该如何去做呢?
self.LBRACE, self.RBRACE, self.LBRACK, self.RBRACK, self.SEMI, self.COMMA, self.DOUBLEQUOTE = map(pp.Suppress, '{}[];,"')
def parse(self, data):
template = CaselessKeyword("structure_a")
words = Word(alphanums + "_" + "." + "[" + "]")
recursive_grammar = Forward()
recursive_grammar <<= (
Group(words("type") + words("name") + self.LBRACE +
ZeroOrMore(recursive_grammar) + self.RBRACE |
words("name") + self.LBRACE +
ZeroOrMore(recursive_grammar) + self.RBRACE |
self.LBRACE + ZeroOrMore(recursive_grammar) + self.RBRACE |
self.LBRACE + ZeroOrMore(words("type")) + self.RBRACE) |
Group(words("name") + self.EQUAL + recursive_grammar |
ZeroOrMore(words("type")) + words("name") + self.EQUAL +
words("value") + Optional(self.COMMA) |
words("name") + self.EQUAL + words("value") +
Optional(self.COMMA))
)
grammar = (template("category") + words("type") + words("name") +
self.LBRACE + ZeroOrMore(recursive_grammar)("members") +
self.RBRACE + Optional(cStyleComment)("short_description"))
result = grammar.searchString(data)
return result
# I want to match this structure
structure_a type name {
variable = 1
}
structure_b name {
# I only want to match a nested structure_a if I create a new
# grammar to match structure_b that have structure_a nested in it.
# Otherwise I want to ignore nested structure_a
structure_a type name {
variable = 2
}
}
目前我的语法匹配 Structure_b 中的内容以及顶级元素。我不希望 pyparsing 匹配 Structure_b 中的内容,除非我首先明确匹配 Structure_b。
最佳答案
写完问题并发布并抽出时间解决问题后,我想我已经找到了解决方案。我认为它匹配嵌套结构_a 的原因是因为它无法找到外部结构_b 的匹配,因此解析器只是移动到下一行文本,并且解析器不知道嵌套结构_a 是嵌套的。所以我重写了我的代码,它似乎可以工作。
self.LBRACE, self.RBRACE, self.LBRACK, self.RBRACK, self.SEMI, self.COMMA, self.DOUBLEQUOTE = map(pp.Suppress, '{}[];,"')
def parse(self, data):
template1 = CaselessKeyword("structure_a")
template2 = CaselessKeyword("structure_b")
words = Word(alphanums + "_" + "." + "[" + "]")
recursive_grammar = Forward()
recursive_grammar <<= (
Group(words("type") + words("name") + self.LBRACE +
ZeroOrMore(recursive_grammar) + self.RBRACE |
words("name") + self.LBRACE + ZeroOrMore(recursive_grammar) +
self.RBRACE |
self.LBRACE + ZeroOrMore(recursive_grammar) + self.RBRACE |
self.LBRACE + ZeroOrMore(words("type")) + self.RBRACE |
# added the nested structure to my recursive grammar
template1("category") + words("type") + words("name") +
self.LBRACE + ZeroOrMore(recursive_grammar)("members") +
self.RBRACE + Optional(cStyleComment)("short_description")) |
Group(words("name") + self.EQUAL + recursive_grammar |
ZeroOrMore(words("type")) + words("name") + self.EQUAL +
words("value") + Optional(self.COMMA) |
words("name") + self.EQUAL + words("value") + Optional(self.COMMA))
)
grammar = (template1("category") + words("type") + words("name") +
self.LBRACE + ZeroOrMore(recursive_grammar)("members") +
self.RBRACE + Optional(cStyleComment)("short_description") |
# Match stucture_b
template2("category") + words("name") + self.LBRACE +
ZeroOrMore(recursive_grammar)("members") + self.RBRACE +
Optional(cStyleComment)("short_description")
)
result = grammar.searchString(data)
return result
# Same example from question...
structure_a type name {
variable = 1
}
structure_b name {
structure_a type name {
variable = 2
}
}
# Results...
Name: name
Category: structure_a
Type: type
['variable', '=', '1']
Name: name
Category: structure_b
Type:
['structure_a', 'type', 'name', ['variable', '=', '2']]
关于python - 使用 pyparsing 如何忽略嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57291991/