如何解析代码(在Python中)?
发布时间:2020-12-16 23:06:07 所属栏目:Python 来源:网络整理
导读:我需要解析一些特殊的数据结构.它们有点像C格式,看起来大致如下: Group("GroupName") { /* C-Style comment */ Group("AnotherGroupName") { Entry("some","variables",3.141); Entry("other",1,2.718); } Entry("linebreaks","allowed",3,1.414 );} 我可以
我需要解析一些特殊的数据结构.它们有点像C格式,看起来大致如下:
Group("GroupName") { /* C-Style comment */ Group("AnotherGroupName") { Entry("some","variables",3.141); Entry("other",1,2.718); } Entry("linebreaks","allowed",3,1.414 ); } 我可以想到几种方法来解决这个问题.我可以使用正则表达式“代码化”代码.我可以一次读取一个字符的代码,并使用状态机来构建我的数据结构.我可以摆脱逗号界线并逐行阅读.我可以编写一些转换脚本,将此代码转换为可执行的Python代码. 是否有一个很好的pythonic方法来解析这样的文件? 这是关于如何解析字符串的一般问题,而不是关于这种特定文件格式的问题. 解决方法
使用pyparsing(Mark Tolonen,当你的帖子通过时我刚刚点击“Submit Post”),这非常简单 – 请参阅下面代码中嵌入的注释:
data = """Group("GroupName") { /* C-Style comment */ Group("AnotherGroupName") { Entry("some",3.141); Entry("other",2.718); } Entry("linebreaks",1.414 ); } """ from pyparsing import * # define basic punctuation and data types LBRACE,RBRACE,LPAREN,RPAREN,SEMI = map(Suppress,"{}();") GROUP = Keyword("Group") ENTRY = Keyword("Entry") # use parse actions to do parse-time conversion of values real = Regex(r"[+-]?d+.d*").setParseAction(lambda t:float(t[0])) integer = Regex(r"[+-]?d+").setParseAction(lambda t:int(t[0])) # parses a string enclosed in quotes,but strips off the quotes at parse time string = QuotedString('"') # define structure expressions value = string | real | integer entry = Group(ENTRY + LPAREN + Group(Optional(delimitedList(value)))) + RPAREN + SEMI # since Groups can contain Groups,need to use a Forward to define recursive expression group = Forward() group << Group(GROUP + LPAREN + string("name") + RPAREN + LBRACE + Group(ZeroOrMore(group | entry))("body") + RBRACE) # ignore C style comments wherever they occur group.ignore(cStyleComment) # parse the sample text result = group.parseString(data) # print out the tokens as a nice indented list using pprint from pprint import pprint pprint(result.asList()) 打印 [['Group','GroupName',[['Group','AnotherGroupName',[['Entry',['some','variables',3.141]],['Entry',['other',2.718]]]],['linebreaks','allowed',1.4139999999999999]]]]] (不幸的是,由于pyparsing定义了一个“Group”类,用于将结构赋予解析的标记,因此可能存在一些混淆 – 请注意条目中的值列表如何分组,因为列表表达式包含在一个pyparsing Group中.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |