【问题标题】:Pyparsing Token Source RangePyparsing 令牌源范围
【发布时间】:2013-04-23 12:29:46
【问题描述】:

如何在 Pyparsing 中以编程方式提取语法规则匹配的源范围(开始和结束位置)?我不能对这个(子)规则使用setParseAction,因为我正在检查另一个回调中的解析树内容,而另一个回调又指定为ParseAction。我还缺少一个以类似于pprint人性化 方式打印parseString() 返回的内容的功能。我知道toList(),但我不确定有趣的信息,例如上下文,是否被这个成员剥夺了。

【问题讨论】:

    标签: python grammar pyparsing rule


    【解决方案1】:

    下面是一些示例代码,展示了如何捕获已解析表达式的位置,并使用dump() 列出已解析数据和命名结果:

    from pyparsing import *
    
    # use an Empty to define a null token that just records its
    # own location in the input string
    locnMarker = Empty().leaveWhitespace().setParseAction(lambda s,l,t: l)
    
    # define a example expression and save the start and end locations
    markedInteger = locnMarker + Word(nums)('value') + locnMarker
    
    # assign named results for the start and end values,
    # and pop them out of the actual list of tokens
    def markStartAndEnd(s,l,t):
        t['start'],t['end'] = t.pop(0),t.pop(-1)
    markedInteger.setParseAction(markStartAndEnd)
    
    # find all integers in the source string, and print
    # their value, start, and end locations; use dump()
    # to show the parsed tokens and any named results
    source = "ljsdlj2342 sadlsfj132 sldfj12321 sldkjfsldj 1232"
    for integer in markedInteger.searchString(source):
        print integer.dump()
    

    打印:

    ['2342']
    - end: 11
    - start: 6
    - value: 2342
    ['132']
    - end: 22
    - start: 18
    - value: 132
    ['12321']
    - end: 33
    - start: 27
    - value: 12321
    ['1232']
    - end: 48
    - start: 44
    - value: 1232
    

    【讨论】:

    • 此功能已被纳入 pyparsing,作为辅助函数 locatedExpr。在此示例中,markedInteger 将替换为 locatedExpr(Word(nums)),并且不需要添加任何解析操作。
    • 如果输入文本包含 字符,也要格外小心。默认情况下,pyparsing 在开始解析之前对输入字符串调用string.expandtabs(),这将改变输入中字符串的预期位置。要抑制此默认行为,请在调用 expr.parseString(inputStringContainingTabs) 之前调用 expr.parseWithTabs()
    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多