首页 > 解决方案 > 保持解析结果的多个匹配

问题描述

如果在搜索中遗漏了这一点,我们深表歉意。

我有一个案例,我试图获取有关 Verilog 网表的一些信息。我需要的信息很简单,假设我需要知道文件中所有模块的名称。(我最终想要更多,但这个例子就足够了)

我为测试和语法定义了以下字符串

mystr = """
module MyModule(
  input somein,
  output someout
);
//this is a comment
endmodule

module MyModule2(
  input somein2,
  output someout2
);
//this is another comment
endmodule
"""
             
module_name = Word(alphanums+'_').setResultsName('module_name')

base_module = (Keyword("module") + module_name + lpar + SkipTo(rpar) + \
                SkipTo(Keyword("endmodule"), include=True)).setResultsName('base_module')

verilog = ZeroOrMore(base_module).setResultsName('modules')


results = verilog.parseString(mystr)

print(results)
print("\n===============\n")
print(results.dump())
print("\n-------\n")
print(results.base_module.dump())
print("\n-------\n")
print(results.base_module.module_name)

运行此程序时,我得到以下信息:

['module', 'MyModule', '(', 'input somein,\n  output someout\n', ');\n//this is a comment\n', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,\n  output someout2\n', ');\n//this is another comment\n', 'endmodule']

===============

['module', 'MyModule', '(', 'input somein,\n  output someout\n', ');\n//this is a comment\n', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,\n  output someout2\n', ');\n//this is another comment\n', 'endmodule']
- base_module: ['module', 'MyModule2', '(', 'input somein2,\n  output someout2\n', ');\n//this is another comment\n', 'endmodule']
- module_name: 'MyModule2'
- modules: ['module', 'MyModule', '(', 'input somein,\n  output someout\n', ');\n//this is a comment\n', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,\n  output someout2\n', ');\n//this is another comment\n', 'endmodule']

-------

['module', 'MyModule2', '(', 'input somein2,\n  output someout2\n', ');\n//this is another comment\n', 'endmodule']

-------

如果您看到,似乎只有一个module_name和的实例base_module。但是,我可以设置listAllMatches=True这会导致module_name两者兼有。理想情况下,我希望能够使用以下内容来分析解析结果:

modules
  [0]
    base_module : [<base module string>]
    module_name : '<name>'
  [1]
    base_module : [<base module string>]
    module_name : '<name>' 

我相信当您匹配同一表达式的多个实例时,我缺少有关如何存储 ParseREsults 的一些基本知识。我过去在许多项目中都使用过 PyParsing,但我通常会进行行搜索,并且没有匹配同一表达式的多个实例。谢谢您的帮助。

标签: pyparsing

解决方案


推荐阅读