python - 使用 pyparsing 如何忽略嵌套结构?

标签 python parsing pyparsing

如果某个结构嵌套在另一种类型的结构中,我无法找到忽略该结构的方法。在下面的示例中,我有一个正在尝试解析的 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/

相关文章:

python - Imagemagick 魔杖使用深度不像命令行那样工作

python - 按数值对 CSV 文件进行排序

python - 仅使用 requirements.txt 安装 PyTables

python - 使用 lxml 模块获取 XML 属性值

python - 使用 pyparsing 进行部分评估

python - 使用 pyparsing 在 python 中解析文本文件

python - 如何拆分数据集以训练/测试某些行依赖的地方?

java - JSONException:没有值(value)(解析 JSON 图像)

HtmlAgilityPack 基本如何获取标题和链接?

python - 以任何顺序和数字处理一系列 pyparsing 表达式